sailsjs - 在应用程序级别跟踪房间的最佳方式是什么

zab*_*mba 8 websocket sails.js

sails.sockets.rooms()sails.sockets.socketRooms()都已弃用

在文档中:

不推荐使用此方法.请使用应用级代码跟踪您的房间.

我是SailsJS的新手.

问题1:我怎么能开始这个?我应该在哪里声明我的房间数组或哈希?

问题2:如何获取连接的客户端列表?

zab*_*mba 5

这是我做的方式。希望这会有所帮助,虽然我不相信它是完美的,但它对我有用。随时提出更正、改进的建议。

sails.rooms = {};在控制器(问题 1)中声明了我最需要它的地方。(您可以随意命名。)

sails. 允许它在整个应用程序中访问。

在控制器中

  /**
   * Socket connection
   */
  connect: function(req, res) {
     // Check if it's socket connection
     if (!req.isSocket) { return res.badRequest(); } 

     // label the room to ROOM_NAME
     sails.sockets.join(req, ROOM_NAME);

     /**
      * Manage my `sails.rooms` HERE
      * e.g. 
      */
      if (!sails.rooms[ROOM_NAME]) {
        sails.rooms[ROOM_NAME] = {};
      }
      sails.rooms[ROOM_NAME][req.socket.id] = HUMAN_FRIENDLY_LABEL;
  }
Run Code Online (Sandbox Code Playgroud)

我最终得到一个如下所示的 JSON:

{
   { "room1" : 
     {
       "ksadj1234clkjnelckjna" : "john",
       "eroiucnw934cneo3vra09" : "marie"
     }
   },
   { "room2" : 
     {
       "kslaksdjfnasjdkfa9jna" : "antoine",
       "qweuiqcnw934cne3vra09" : "michelle"
    }
   }
}
Run Code Online (Sandbox Code Playgroud)

config/sockets.js,我管理断开连接

  afterDisconnect: function(session, socket, cb) {
    console.log(socket.id + " disconnected");
    /**
     * Manage sails.rooms HERE
     * e.g.
     */
    for (r in sails.rooms) {
      delete sails.rooms[r][socket.id];
      //
      // YOUR CODE
      //
    }

    return cb();
  },
Run Code Online (Sandbox Code Playgroud)

注意:您可以使用sails.io.sockets.in(ROOM_NAME). 这也应该有助于清除sails.rooms断开连接的套接字。