1

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> }));

感谢您的时间和耐心。

4

0 回答 0