如何调试Nessus扫描时socket.io+Express出现的ECONNRESET错误
ECONNRESET错误导致Node服务器崩溃(Nessus扫描场景)
运行Nessus Essentials基础网络扫描时,Node服务器因ECONNRESET错误崩溃,错误栈如下:
node:events:505 throw er; // Unhandled 'error' event ^ Error: read ECONNRESET at TCP.onStreamRead (node:internal/stream_base_commons:217:20) Emitted 'error' event on Socket instance at: at emitErrorNT (node:internal/streams/destroy:157:8) at emitErrorCloseNT (node:internal/streams/destroy:122:3) at processTicksAndRejections (node:internal/process/task_queues:83:21) { errno: -54, code: 'ECONNRESET', syscall: 'read' }
已确认两个关键现象:
- 仅在Node版本<16.16.0时触发该问题
- 移除socket.io,或给socket.io使用独立端口/HTTP服务器实例时,问题消失
已将应用简化为可复现错误的最小项目:
import express from 'express'; import { Server } from 'socket.io'; import morgan from 'morgan'; import winston from 'winston'; const logger = winston.createLogger({ level: 'debug', format: winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }), winston.format.splat(), winston.format.prettyPrint(), winston.format(info => { info.level = `[${info.level.toUpperCase()}]`; return info; })(), winston.format.printf(info => { if (typeof info.message === 'object') { info.message = JSON.stringify(info.message, null, 3); } return `${info.timestamp} ${info.level} ${info.message}`; }), ), transports: [new winston.transports.Console()] }); const morganMiddleware = morgan( ':remote-addr :method :url :status :response-time ms', { stream: { write: message => logger.http(message.trim()), }, }); const app = express(); app.use(morganMiddleware); const port = 3001; const httpServer = app.listen(port, () => { logger.info( `Server is now listening on port ${port} ✓`, ); new Server(httpServer); }); export default app;
移除new Server(httpServer);行后,应用不会崩溃,说明错误与socket.io和Express共用同一HTTP连接、扫描期间套接字异常断开有关,但无法进一步调试。
尝试多种错误捕获方式,仅process.on('uncaughtException')能捕获该错误,但此时无法安全恢复——该错误绕过了Express和socket.io的所有错误处理机制。
目前可通过升级Node版本解决问题,但需要理解问题本质以确保彻底修复,同时希望增强应用韧性应对未来类似错误。
另外有两个技术疑问:
- 能否在不使用单独端口的情况下分离socket.io与Express?
- 能否通过Express将WebSocket相关请求代理到socket.io,而不共用同一HTTP服务器?
欢迎提供调试思路、问题本质分析或规避方案的建议。
内容的提问来源于stack exchange,提问作者jonneve
相关产品推荐
相关产品推荐

