Javascript Socket.io为`on`侦听器提供多个处理程序,如在Express中

Javascript Socket.io为`on`侦听器提供多个处理程序,如在Express中,javascript,node.js,typescript,express,socket.io,Javascript,Node.js,Typescript,Express,Socket.io,Express允许开发人员将多个函数作为处理程序链接到单个路由。发件人: 多个回调函数可以处理路由(请确保 指定下一个对象)。例如: app.get('/example/b',函数(req,res,next){ log('响应将由下一个函数发送…') 下一个() },功能(req,res){ res.send('Hello from B!') }) 如果开发人员希望在继续执行最终功能之前进行验证,这是非常好的。这就是为什么中间产品是一种东西 另一方面,Socket.io只接受一个处理程序 发件

Express允许开发人员将多个函数作为处理程序链接到单个路由。发件人:

多个回调函数可以处理路由(请确保 指定下一个对象)。例如:

app.get('/example/b',函数(req,res,next){
log('响应将由下一个函数发送…')
下一个()
},功能(req,res){
res.send('Hello from B!')
})
如果开发人员希望在继续执行最终功能之前进行验证,这是非常好的。这就是为什么中间产品是一种东西

另一方面,Socket.io只接受一个处理程序

发件人:

on(事件:字符串,侦听器:函数):名称空间;
这意味着我不能有特定于事件的中间件。我了解
io。对于全局中间件,可以使用
,也可以选择每个名称空间使用中间件,但我只需要每个事件


我的变通方法 选项1:
try
catch
在每个事件处理程序中。
试试看{
验证当前播放器(套接字);
}捕获(e){
返回手柄未通过验证(插座,e);
}
// ... 代码的其余部分
Pro:可读Con:超级重复。这意味着每个相关的入口点都以相同的5行代码开始,每次都做完全相同的事情

如果“中间件”返回值,则其外观如下:

让foo:Something;
试一试{
[foo]=验证当前播放器(套接字);
}捕获(e){
返回手柄未通过验证(插座,e);
}
// ... 剩下的代码,使用foo
选项2:带条件返回的通用验证
const validation=validate(socket,()=>validateCurrentPlayer(socket));
if(validation.error){
返回;
}
const[foo]=validation.result;
这是
验证

导出函数验证任意>(socket:socket,func:T):{
错误:布尔;
结果:返回型;
} {
let结果:ReturnType=null;
让错误=错误;
试一试{
结果=func();
}捕获(错误){
handleFailedValidation(套接字、错误);
}
返回{
结果,,
错误,
};
}
正如您所看到的,它只包装了
try
catch

Pro:非重复性Con:仍有X行代码要复制粘贴到几个处理程序中


我不喜欢这些变通办法。 我正在拼命寻找类似于Express的方法,因此如果验证成功,我可以有条件地调用
next()

你知道有什么办法吗

谢谢