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

Socket.io中间件传递错误失效,常规服务器错误处理正常求解决

Socket.io中间件自定义错误无法触发处理器的解决方案
  • 检查CustomError的实现
    Socket.io对中间件传递的错误有特定要求,必须是继承自标准Error的实例,且建议包含data字段(用于携带状态码和消息)。如果你的CustomError没有满足这一点,Socket.io可能无法识别它是错误对象。
    修正后的CustomError示例:

    class CustomError extends Error {
      constructor(statusCode, message) {
        super(message);
        this.statusCode = statusCode;
        this.data = { statusCode, message }; // Socket.io识别错误的关键字段
        Object.setPrototypeOf(this, CustomError.prototype); // 确保原型链正确
      }
    }
    
  • 单独监听Socket.io的连接错误事件
    Socket.io的连接错误不会走常规HTTP错误处理器(因为WebSocket不是HTTP请求),需要单独监听connect_error事件来捕获中间件抛出的错误:

    io.on('connect_error', (error) => {
      // 这里执行你的自定义错误处理逻辑,比如日志记录
      console.error('Socket连接验证失败:', error.statusCode, error.message);
      // 客户端可通过监听'connect_error'事件接收该错误信息
    });
    
  • 中间件内错误传递的兼容处理
    如果暂时无法修改CustomError,可在中间件内将其包装成Socket.io能识别的错误对象:

    io.use((socket, next) => {
      const authorizationHeader = socket.handshake.headers?.authorization;
      if (!authorizationHeader) {
        const err = new Error(NOT_AUTHORIZED_MESSAGE);
        err.statusCode = 401;
        err.data = { statusCode: 401, message: NOT_AUTHORIZED_MESSAGE };
        next(err);
        return;
      }
      const token = authorizationHeader.split(' ')[1];
      const isVerified = !!decodeLoginCookieToken(token);
      if (isVerified) {
        next();
      } else {
        const err = new Error(NOT_AUTHORIZED_MESSAGE);
        err.statusCode = 401;
        err.data = { statusCode: 401, message: NOT_AUTHORIZED_MESSAGE };
        next(err);
      }
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:23:14