如何解决如何从节点js中的'net'模块捕获ECONNRESET错误?并防止整个程序终止?
如果我尝试使用NodeJS文档中的非常基本的代码
//CLIENT.js
const net = require('net');
const client = net.createConnection({ port: 8124 },() => {
// 'connect' listener.
console.log('connected to server!');
client.write('I am client');
});
client.on('data',(data) => {
console.log(data)
client.write('I am client');
//client.end(); I don't want to close the connection
});
client.on('end',() => {
console.log('disconnected from server');
});
//SERVER.js
const net = require('net');
const server = net.createServer((c) => {
// 'connection' listener.
console.log('client connected');
c.on('end',() => {
console.log('client disconnected');
});
c.on('data',(data) => {
console.log(data)
c.write("I am server");
})
c.pipe(c);
});
server.on('error',(err) => {
console.log("Something went worng"); //I hope this will be triggered in cases of error
});
server.listen(8124,() => {
console.log('server bound');
});
现在是问题:-
- 我启动SERVER.js
node SERVER.js
- 然后,我在另一个CMD选项卡上启动CLIENT.js
node CLIENT.js
。 - 到目前为止一切顺利...'我是服务器我是客户端.........'
注意,我正在使用Windows 10
- 现在,我只需按
ctrl + C
即可关闭客户端程序,然后服务器端程序终止并抛出'read ECONNRESET'
完整错误日志
events.js:292
throw er; // Unhandled 'error' event
Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:205:27)
Emitted 'error' event on Socket instance at:
at emitErrorNT (internal/streams/destroy.js:92:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
errno: 'ECONNRESET',code: 'ECONNRESET',syscall: 'read'
}
我理解为什么从理论上讲会导致此错误,所以我尝试以另一种方式解决该错误,因为该程序未触发server.on('error')
事件,它只是终止了整个服务器程序。
所以我尝试了
//SERVER.js
const net = require('net');
const server = net.createServer((c) => {
// 'connection' listener.
console.log('client connected');
try {
c.on('end',(data) => {
console.log(data)
c.write("I am server");
})
c.pipe(c);
} catch(e){
//hoping of catching the error
console.log("Here is your error",e)
// !!! But no error is caught here and the program still gets completely terminated
}
});
server.on('error',() => {
console.log('server bound');
});
那么我该如何处理“读取ECONNRESET”错误?
解决方法
如果环绕尝试捕获整个代码,并在catch中再次调用main / starting函数,它将再次启动,但是它将陷入无尽的try-catch循环中,直到获得ECONNRESET的服务为止再也不起来了,
确保您的应用程序所依赖的服务的运行时间为99.99999%,并让您的应用程序失败并重新启动。 (例如,使用PM2类型的实用程序)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。