Как управлять клиентами socket.io с базой данных - PullRequest
0 голосов
/ 29 марта 2019

У меня есть веб-сервер nodejs с socket.io и на стороне клиента angular2. Я пытаюсь управлять несколькими через подключенных к socket.io клиентов, но только тех, кто вошел в свои учетные записи.

Например, у меня есть зона поддержки для пользователей и администраторов. при получении заявки от пользователя пользователь должен получить частное уведомление socket.io, т. е. заявка была обработана администратором. Это хорошо работает, если администратор и пользователь входят в систему должным образом и администратор видит заявку. (оставив свой билет на тестирование) Но если администратор обновит страницу (по F5), а awnsers снова получит свой билет, уведомление не появится.

Это та часть, где пользователь подключается к веб-серверу по angular2:

io.on('connection', function (socket) {
    console.log('a user connected ', socket.id);
    io.sio_id = socket.id; // set socket id for client
    socket.emit('sio_id', io.sio_id); // send it to client

    socket.on("disconnect", function () {
        console.log('a user disconnected');
        User.findOne({
            where: {sio_id: socket.id}
        })
            .then((user) => {
                if (user) {
                    user.update({sio_id: null});
                }
            });
    });

    // receive the userId to update users sio_id in database
    socket.on('set_sio_id', function (uData) {

        User.findOne({where: {id: uData.uid}})
            .then((user) => user.update({sio_id: uData.sid}))
            .then(() => {
                let socket = io.sockets.connected[uData.sid];
                socket.join(uData.sid)
            })
    })
});

Идентификатор клиента будет отправлен клиентскому приложению, которое затем отправит обратно на сервер снова clientId И userId. Затем clientId будет сохранен в базе данных. После этого я хочу использовать этот «sio» -id для связи с Пользователем с помощью socket.io следующим образом:

ticket.update({status: 0, awnser_text: awnser}).then((result) => {
            const socketId = ticket.dataValues.creator.dataValues.sio_id;


let socket = io.sockets.connected[socketId];

// if user is online, emit
io.to(socketId).emit('support_awnser', 'ok');
         

res.send({status: true, data: result});

Итак, я получаю Id пользователя, которому принадлежит билет, и получает его sio-id из базы данных и что-то испускает.

Вот как угловое приложение слушает и издает:

 /**
   * Listen to an event
   * @param to
   */
  listen(to: string) {
    return new Observable(observer => {
      this.socket = io(this.SERVER_URL);
      this.socket.on(to, data => {
        observer.next(data);
      });
      return () => {
        this.socket.disconnect();
      };
    });
  }

  /**
   * Send something to the server
   * @param event
   * @param msg
   */
  send(event, msg) {
    this.socket.emit(event, msg);
  }

Как уже говорилось, он работает правильно при входе в систему, а НЕ при обновлении страницы. Если я обновил страницу, он не работает и ничего не отправляется (или не получает)

...