【问题标题】:Node.js app crashes whenever the remote host closes socket connection每当远程主机关闭套接字连接时,Node.js 应用程序就会崩溃
【发布时间】:2019-10-16 13:14:36
【问题描述】:

这里是服务器套接字的源代码:

const server = net.createServer(client => {
   // 'connection' listener.
   let processing = false;

   client.setTimeout(config.socket.timeout);
   client.on('data', data => {
      const batches = data.toString().split(',');

      if (!processing && batches && batches.length) {
         processing = true;

         processBatch(batches, error => {
            const status = error ? 'ERR' : 'SUCC';

            logger.verbose('... Ended with status : ' + status);

            client.write(status, () => client.end());
         });
      }
   });
   client.on('timeout', () => {
     logger.warn('Client socket did time out');
     client.end();
   });

   //client.on('end', () => {});
});
server.on('error', error => {
   logger.info('Socket error');
   logger.error('Error: ', error);
});
server.listen(config.socket.port, () => {
   console.log('*** Socket listening on port', config.socket.port);
});

客户端将连接,发送它的数据,然后远程关闭连接,这会触发服务器错误处理程序,记录消息:

Error: This socket has been ended by the other party
    at Socket.writeAfterFIN [as write] (net.js:441:14)
    at file:///home/thermo/bwkl/src/service.js:191:20
    at file:///home/thermo/bwkl/src/service.js:123:13 {
 code: 'EPIPE'
}

如何防止这种情况,并在远程主机过早结束连接时优雅地关闭客户端套接字?

【问题讨论】:

    标签: javascript node.js sockets


    【解决方案1】:

    server 错误处理程序不会捕获连接错误,因为错误事件是由 client 发出的。

    您应该在client 实例上为error 事件定义一个侦听器,以便处理相关错误:

    client.on('error', (err) => {
      console.log('Connection error:', err.message);
    });
    

    这将防止 Node.js 进程崩溃。您可以在侦听器中根据需要处理错误。

    【讨论】:

    • 是的,看来我也需要client.on('end', () => {}),并且两者都可以防止进程崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多