如何使用数据库管理socket.io的客户端

时间:2019-03-29 13:06:34

标签: node.js angular websocket socket.io client

我有一个带有socket.io并在客户端angular2上的nodejs Web服务器。 我试图通过socket.io连接的客户端管理多个客户端,但仅管理那些在其帐户中登录的客户端。

例如,我为用户和管理员提供了一个支持区域。在给用户添加票证时,该用户应收到一个socket.io私人通知,即票证已由管理员添加。如果管理员和用户正确登录并且管理员将票证盖起来,则此方法效果很好。 (展示自己的测试票) 但是,如果管理员刷新页面(按F5键)并再次给自己盖一张票,该通知将不会出现。

这是用户通过angular2连接到Web服务器的部分:

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

客户端ID将发送到客户端应用程序,然后客户端应用程序再次将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);
  }

如前所述,它可以正常登录并且不刷新页面。如果我刷新页面,则该页面不起作用,不会发出(或接收)任何内容

0 个答案:

没有答案