Я использую ws
через экспресс-плагин, 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)
может использоваться с этим токеном для использования сокета.Я также расширил прототип экспресс-приложения, чтобы другие маркеры маршрутов могли использовать wscManager
:
app.response._man = man;
Теперь мой вопрос - это правильный подход к отслеживанию клиента?В других обработчиках маршрута менеджер используется так:
// in route handler
res._man.send(JSON.stringify({ status: <STATUS>, message: <MSG> }));
Спасибо за ваше время и терпение.