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

