在Node.js的网络编程场景中,无论是HTTP服务、TCP服务还是WebSocket连接,连接关闭时的错误信息捕获都是排查问题的重要环节。连接关闭可能由多种原因导致,比如客户端主动断开、网络超时、服务端异常等,只有获取到详细的错误信息,才能快速定位根因。

不同场景下的错误捕获方式
TCP/Socket连接场景
Node.js的net模块创建的Socket实例,会在连接发生错误时触发error事件,同时连接关闭时会触发close事件。我们可以通过监听这两个事件获取详细信息:
const net = require('net');
// 创建TCP服务器
const server = net.createServer((socket) => {
// 监听error事件获取错误详情
socket.on('error', (err) => {
console.log('连接发生错误:', err.message);
console.log('错误码:', err.code);
console.log('系统调用:', err.syscall);
});
// 监听close事件,确认连接关闭状态
socket.on('close', (hadError) => {
if (hadError) {
console.log('连接因错误关闭');
} else {
console.log('连接正常关闭');
}
});
// 模拟发送数据
socket.write('欢迎连接TCP服务\n');
});
server.listen(3000, () => {
console.log('TCP服务启动在3000端口');
});上面的代码中,error事件的回调参数err是标准的Error对象,其中message是错误描述,code是错误码,比如ECONNRESET表示连接被对端重置,ETIMEDOUT表示连接超时。close事件的hadError参数会标识连接关闭是否由错误导致。
HTTP服务场景
HTTP服务的请求连接本质也是基于Socket,我们可以通过监听request事件的socket属性来获取连接错误信息:
const http = require('http');
const server = http.createServer((req, res) => {
// 获取当前请求的socket实例
const socket = req.socket;
socket.on('error', (err) => {
console.log('HTTP连接错误:', err.message);
console.log('错误码:', err.code);
});
socket.on('close', (hadError) => {
console.log('HTTP连接关闭,是否因错误:', hadError);
});
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
});
server.listen(3001, () => {
console.log('HTTP服务启动在3001端口');
});常见连接关闭错误码说明
捕获到错误后,我们可以根据错误码快速判断错误类型,常见的错误码如下:
| 错误码 | 含义 | 常见场景 |
|---|---|---|
| ECONNRESET | 连接被对端重置 | 客户端突然关闭进程、网络中断 |
| ETIMEDOUT | 连接超时 | 服务端响应过慢、网络延迟过高 |
| EPIPE | 管道破裂 | 向已经关闭的连接写入数据 |
| ECONNREFUSED | 连接被拒绝 | 目标服务未启动、端口未监听 |
注意事项
- 如果没有监听
error事件,Node.js会默认抛出未捕获的错误导致进程崩溃,所以所有连接相关的Socket实例都建议添加错误监听。 - 错误对象的属性可能因系统不同略有差异,除了
message和code,还可以查看errno、syscall等属性获取更多信息。 - 对于WebSocket等基于HTTP升级的连接,同样可以通过监听底层Socket的
error事件获取关闭时的错误信息。