我正在开发一个涉及使用 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
使用不同的短语。我个人在我的套接字服务器上使用 oops
。 socket.emit('oops', {error})
。您可以在他们的 page 上阅读更多关于错误处理的信息。 .
要补充一点,socket.emit('error')
不会将错误或任何数据传递给客户端,而是由服务器处理,这就是为什么您需要使用不同的短语。
关于javascript - try catch 在 Node socket.io 监听器中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63895603/