gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:49:50 25 4
gpt4 key购买 nike

我正在开发一个涉及使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com