Node.js中处理各类连接时,连接异常关闭往往会带来调试难题,很多场景下默认的关闭提示信息不足以定位问题根源,需要主动捕获更详细的错误信息来排查问题。

连接关闭的常见场景和事件区别
Node.js里的连接主要分为TCP Socket连接、HTTP连接、数据库连接等类型,连接关闭时通常会触发close事件和error事件,两者的触发逻辑不同:
close事件:连接完全关闭时触发,无论关闭原因是正常关闭还是异常错误,都会在最终触发该事件,事件回调默认会传入一个布尔值表示是否是因为错误关闭。error事件:连接发生错误时触发,错误发生后会先触发error事件,再触发close事件,事件回调会携带具体的错误对象,包含错误码、错误信息等详细内容。
TCP Socket连接关闭的错误获取
TCP连接是最常见的连接类型,通过net模块创建的Socket实例可以直接监听error事件获取详细错误:
const net = require('net');
// 创建TCP客户端连接
const client = net.connect({ port: 8080, host: '127.0.0.1' }, () => {
console.log('连接建立成功');
});
// 监听error事件获取连接关闭时的详细错误
client.on('error', (err) => {
console.log('连接发生错误,详细信息:');
console.log('错误码:', err.code);
console.log('错误信息:', err.message);
console.log('完整错误对象:', err);
});
// 监听close事件确认连接关闭状态
client.on('close', (hadError) => {
if (hadError) {
console.log('连接因错误关闭');
} else {
console.log('连接正常关闭');
}
});HTTP连接关闭的错误获取
HTTP服务或客户端的连接关闭错误可以通过监听请求或响应对象的error事件捕获,以下以HTTP客户端为例:
const http = require('http');
const req = http.request({
hostname: '127.0.0.1',
port: 3000,
path: '/test',
method: 'GET'
}, (res) => {
console.log('响应状态码:', res.statusCode);
// 监听响应流的error事件
res.on('error', (err) => {
console.log('响应流错误:', err.message);
});
});
// 监听请求本身的error事件,捕获连接建立、发送过程中的错误
req.on('error', (err) => {
console.log('HTTP请求连接错误:');
console.log('错误码:', err.code);
console.log('错误描述:', err.message);
});
req.end();常见错误码说明
捕获到的错误对象中code字段是定位问题的关键,以下是常见的连接关闭相关错误码:
| 错误码 | 含义说明 |
|---|---|
| ECONNRESET | 对端重置了连接,通常是服务端或客户端突然关闭连接,没有正常挥手 |
| ECONNREFUSED | 连接被拒绝,通常是目标端口没有服务监听 |
| ETIMEDOUT | 连接超时,在指定时间内没有建立连接 |
| EHOSTUNREACH | 目标主机不可达,通常是网络不通或者地址错误 |
注意事项
在捕获连接错误时需要注意,如果不监听error事件,Node.js会默认将错误抛出导致进程崩溃,所以所有连接实例都建议显式监听error事件做错误处理。另外如果连接同时绑定了error和close事件,不要在close事件里重复做错误处理逻辑,避免逻辑冗余,优先以error事件携带的详细信息为准。