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

Socket.io服务端发送的Error对象在客户端缺失message属性问题

Socket.io 发送错误对象时丢失message属性且无法识别为Error实例的问题

我写了一套错误处理代码,能把错误过滤成预定义的自定义错误对象(比如InvalidJWTError),这些对象都包含name、message、status三个属性。

在Socket.io的事件处理函数里发生错误时,我用try-catch块捕获错误,再通过error事件把过滤后的错误对象发给客户端,具体实现如下:

服务端代码

// 服务端实现:
io.on('connection', socket => {
    // ...
    socket.on('authenticated', async token => {
        // 手动传入无效token触发InvalidJWTError,捕获后发送给客户端
        token = 'nope';
        socket.handshake.auth.token = token;

        try {
            const userDTO = await services.userService.authenticate(token);
            socket.data.user = userDTO;
        } catch(error) {
            // 抛出的错误对象:
            // InvalidJWTError: Invalid JWT provided.
            // ...(堆栈跟踪)
            // status: 401
            socket.emit('error', ErrorHandler.handle(error));
        }
    });
    // ...
});

客户端代码

// 客户端实现:
socket.on('error', error => {
    console.log(error);
    // 输出:
    // { name: "InvalidJWTError", status: 401 }
    // 本应包含值为"Invalid JWT provided."的message属性
});

如代码注释所述,客户端收到的错误对象缺失message属性,且不会被识别为Error实例,仅被视为普通Object。

我已经尝试过这些方案:

  • 不使用自定义错误类,改用原生Error对象(比如new Error('Something went wrong!')),但客户端仍将其识别为Object而非Error实例,message属性依旧丢失,最终仅收到空对象{};
  • 将事件名称从"error"改为"errorOccured",结果能正常收到包含所有属性的普通对象,但依旧不是Error实例。

Socket.io为何会有这种表现?


内容的提问来源于stack exchange,提问作者M. Çağlar TUFAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:35:39