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

如何调试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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:55:24