javascript - try catch 在 Node socket.io 监听器中不起作用

标签 javascript node.js typescript websocket

我正在开发一个涉及使用 WebSocket 的应用程序。我有以下代码作为应用程序的一部分:

io.on('connection', socket => {

   let PLAYER = {};

   // Listener for event 1
   // Listener for event 2
   // ...

   socket.on('setName', ({name, role, room}) => {

        PLAYER.name = name;
        PLAYER.role = role;
        PLAYER.room = room;

        try{
            joinRoom(PLAYER);  // This function can throw an error
            socket.emit('roomJoin');
        }catch(e){
            socket.emit('error', e.message);
            return;
        }
    });
});

现在,当 joinRoom 函数抛出错误时,Node 会崩溃并出现以下异常:

events.js:306
    throw err; // Unhandled 'error' event
    ^

Error [ERR_UNHANDLED_ERROR]: Unhandled error. ('error message')

永远不会发出 error 事件。是什么导致 try catch block 失败?

注意:我使用的是 TypeScript,但在上面的代码片段中删除了类型声明,因为它们与问题无关。

编辑 1:

我用如下更简单的代码重新创建了问题:

import express from 'express';
import socketio from 'socket.io';
import http from 'http';

const PORT = process.env.PORT || 8000;

const app = express();
const server = http.createServer(app);
const io = socketio(server);

server.listen(PORT, () => {
    console.log(`Listening on port ${PORT}`);
});

const checkLength = (bar) => {
    if(bar.length > 14){
        throw Error('word is too long!');
    }
    // ...
}

io.on('connection', socket => {
    console.log('new socket connection');

    socket.on('foo', ({bar}) => {
        try{
            checkLength(bar);
        }catch(e){
            socket.emit('error', e.message);
            return;
        }
        console.log('app did not crash!');
    });
}

bar 的长度大于 14 时,应用程序崩溃并出现与上述相同的错误。

最佳答案

在我的本地计算机上复制服务器后,我意识到您是在 socket.io 的保留关键字上调用 emit。当您调用 socket.emit('error', e.message) 时,预期存在一个监听器。像这样的:

socket.on('error', err => {
  // An error occurred. 
})

您应该为您的emit 使用不同的短语。我个人在我的套接字服务器上使用 oopssocket.emit('oops', {error})。您可以在他们的 page 上阅读更多关于错误处理的信息。 .

要补充一点,socket.emit('error') 不会将错误或任何数据传递给客户端,而是由服务器处理,这就是为什么您需要使用不同的短语。

关于javascript - try catch 在 Node socket.io 监听器中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63895603/

相关文章:

javascript - 为什么数组在响应中总是空的?

javascript - 如何通过搜索选择HTML表格的行索引

node.js - Mongoose Model.find() 参数问题

javascript - 无法从文本框中输出值的乘法(可能是 NAN)-Backbone.js

node.js - 如何删除 Node.js 中的 Cognito 用户?

javascript - 使用 [filter, map, some, reduce etc] 从二维数组的子对象创建一维数组

typescript - 如何正确扩展FormGroup

javascript - Momentjs 倒计时 - 持续时间显示负数

javascript - 流式 Web 应用程序 - Twitter、Facebook、NoSQL 还是 SQL?

javascript - Coturn/turnserver : error 437: Mismatched allocation: wrong transaction ID (WebRTC)