我ws
通过一个 express 插件使用,express-ws
. 我的后端需要跟踪客户,并且只向特定的或客户发送消息。现在,我只是将客户端套接字与令牌一起保存。因此,当客户端连接时,客户端会发送如下消息:
{"path":"/openUserSocket","token":"<CLIENT_TOKEN_VALUE>"}
这会在后端注册一个套接字。套接字由一个类管理,该类wscManager
将套接字保存在一个普通对象中。所以,要注册一个套接字,我这样做:
// adding web socket support
const expressWs = require('express-ws')(app, null, {
wsOptions: {
clientTracking: true
}
});
let man = new wscManager();
// then in the web socket handler
app.ws('/', (sck,req) => {
sck.on('message',(msg)=>{
// handle messages
if(msg.path === '/openUserSocket'){
man.set(msg.token, sck);
return sck.send(JSON.stringify({ status: 200, message: 'Ok' }));
}
else if(msg.path === '/<SOME_OTHER_PATH>'){
// use that socket
}
// ... other route handling
}
}
现在,正如我在上面的代码中所示,我正在尝试保存套接字以供以后使用。set
只需将令牌用作将套接字对象保存在另一个对象中的键。稍后,get(token)
可以与那个令牌一起使用套接字。我还扩展了 express 应用原型以允许其他路由句柄使用wscManager
:
app.response._man = man;
现在,我的问题是这是正确的客户跟踪方法吗?在其他路由处理程序中,管理器的使用方式如下:
// in route handler
res._man.send(JSON.stringify({ status: <STATUS>, message: <MSG> }));
感谢您的时间和耐心。