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
相关产品推荐
相关产品推荐

