You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js TCP服务器出现ECONNRESET未处理错误的修复方案咨询

修复Node.js TCP服务器的ECONNRESET未处理错误

嘿,这个问题我太熟了!你碰到的ECONNRESET错误,本质是服务器端的Socket对象没有监听error事件。当你在客户端调用client.destroy()主动断开连接时,服务器端对应的Socket会触发error事件,但因为没写任何处理逻辑,Node.js就会抛出这个未捕获的异常。

怎么修复?

只需要给每个连接到服务器的Socket实例添加error事件监听器就行,同时也建议给服务器本身加上错误监听,避免其他潜在问题。修改后的服务器代码如下:

var net = require('net');
var server = net.createServer(function(socket) {
  socket.write('Connected to server !\r\n');
  socket.pipe(socket);

  // 处理Socket的error事件,避免未捕获异常
  socket.on('error', function(err) {
    console.log(`Socket error: ${err.message}`);
    // 主动销毁socket完成清理
    socket.destroy();
  });
});

// 给服务器本身添加error监听,处理端口被占用等启动错误
server.on('error', function(err) {
  console.log(`Server error: ${err.message}`);
});

// 监听SIGINT信号,允许用Ctrl+C优雅关闭服务器
process.on('SIGINT', function() {
  console.log('\nShutting down server...');
  server.close(function() {
    console.log('Server closed.');
    process.exit(0);
  });
});

server.listen(1337, '127.0.0.1');

为什么这样能解决问题?

  • 当客户端断开连接触发Socket的error事件时,我们的监听器会捕获这个错误,打印信息并主动销毁socket,避免Node.js抛出未处理异常。
  • 给服务器添加error监听,可以处理比如端口被占用这类启动时的错误,不会让进程直接崩溃。
  • 新增的SIGINT信号监听,让你可以用Ctrl+C直接关闭服务器,再也不用敲killall node了!

额外说明

你原来的代码里socket.pipe(socket)是把socket的输入再写回输出(回声服务器),这个逻辑没问题,加上错误监听后就不会再抛出那个讨厌的错误了。测试一下:启动服务器,再启动客户端,客户端收到消息后断开,服务器终端只会打印Socket error的提示,不会崩溃,下次启动客户端依然能正常连接~

内容的提问来源于stack exchange,提问作者Blockzii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:22:34