Отслеживание WS клиентов в Nodejs - PullRequest
0 голосов
/ 23 апреля 2019

Я использую 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> }));

Спасибо за ваше время и терпение.

...