Socket.io 服务器"Error-handling middleware"等同于快递?


const app = require('express')();
const native_server = require('http').createServer(app);
const socketio = require("socket.io")
const ws_server = socketio(native_server)
native_server.on("error", err=> {
console.log(`Error caught in the native server`)
console.log(err)
});
ws_server.on("connection", (socket) => {
socket.on("error", (error) => {
console.log(error)
console.log("Caught error in the socket error handler")
})
socket.on("test", (req, cb) => {
console.log("On test")
// cb("Test complete")
throw Error("hi")
})
})
native_server.listen(3001)
const io = require("socket.io-client")
const cli = io("http://localhost:3001")
cli.emit("test")

当在套接字事件处理程序中抛出错误时,它只是终止服务器,我的终端返回提示。native_server.on("error", ...)似乎不起作用,因为它使用EventEmitter,但这是我想要的

我想处理这个错误,就像你如何使用在快递中做到这一点一样

app.use((err, req, res, next) => { ... handle unhandled error ... })

socketio是否有"通用错误处理程序"?

您不能像express中那样为socket.io提供错误处理中间件,但您仍然可以做一些不同的事情,只需将回调封装在您自己的错误处理程序中,如:

const errorHandler = (handler) => {
const handleError = (err) => {
console.error("please handle me", err);
};
return (...args) => {
try {
const ret = handler.apply(this, args);
if (ret && typeof ret.catch === "function") {
// async handler
ret.catch(handleError);
}
} catch (e) {
// sync handler
handleError(e);
}
};
};
// server or client side
socket.on("hello", errorHandler(() => {
throw new Error("let's panic");
}));

示例取自官方文件

最新更新