【问题标题】:connected users' list in sails socketSails 套接字中的已连接用户列表
【发布时间】:2015-02-26 05:21:04
【问题描述】:

我目前已经开始在前端使用带有 angularJs 的sailsJS 与套接字进行实时通信。

Sailsjs 通过“sails.io.js”为 websocket 提供内置支持。在客户端添加此库后,此代码将添加到 Angular 的聊天控制器中。

客户端代码

io.socket.get('/chat',{token:token},function(users){
console.log(users);
});

chatController 在sails 端的动作是这样的。

服务器端代码

 chat: function (req, res) {
   console.log(req.isSocket);
 //this gives true when called through client.
})

事实上,sails 很新,所以我想建议如何维护连接用户的列表,因为 m 不使用 redis 作为存储目的。适配器是 memory.array 不是一个好主意,因为它会在重新启动 server.m 时消失帆版 0.11.0。

提前感谢。

【问题讨论】:

    标签: socket.io sails.js


    【解决方案1】:

    我有点新,但学得很快,这些建议应该能让你到达那里,除非其他人的反应很棒......

    他们在 11 中对其进行了更改,但在 10.5 中,我在 config 文件夹中使用了 sockets.js,并在连接时将会话数据与他们的套接字一起存储在一个数组中。 我在 APIs/service 中创建了一个包含数组和套接字关联函数的服务。

    对于 v11,您不能完全一样地执行此操作,但您可以让客户端的第一个“hello”调用调用关联函数的控制器中的函数。

    一些提示是不要让客户端告诉你他们是谁,因为不要只从参数中获取用户名,而是从 req.session 获取它

    (假设您已设置用户身份验证)

    就我而言,我有 在 api/services/Z.js 中(将文件放在这里使其功能可全局访问)

    var socketList = []; 
    module.exports = {
    associateSocket: function(session, socket) { // send in your username(string) socket(object) id(mongoId) and this will push to the socketlist for lookups
        sails.log.debug("associate socket called!",socketList.length)
        var iHateYou = socketList
        //DEBUG
        var sList = socketList
        var util = require('util')
        if (session.authenticated){
            var username = session.user.auth.username
            var userId = session.user.id
            // sails.log.debug("Z: associating new user!",username,userId,socket)
            if (username && socket && userId) {
                sList[sList.length]= {
                    username: session.user.auth.username,
                    socket: socket,
                    userId: session.user.id,
                };
                sails.log.debug('push run!!! currentsocketList length',socketList.length)
            } else sails.log("Z.associateSocket called with invalid data", username, userId, authId, socket)
        }else{sails.log.warn("Z.associateSocket: a socket attempted to associate itself without being logged in")}
    },
    

    }

    在我的 config/sockets.js

    onConnect: function(session, socket) {
        Z.associateSocket(session,socket)
        if (session.user && session.user.auth){
          sails.log("config/sockets.js: "+session.user.auth.username+" CONNECT! session:",session)
        }else sails.log.warn('connect called on socket without an auth, the client thinks it already has a session, so we need to fix this')
    
        // By default, do nothing.
      },
    

    然后您可以在您的服务文件中添加一些功能以根据用户名和密码进行查找,删除断开连接的套接字等(我目前正在使用水锁进行身份验证,尽管正在讨论切换回帆-生成-身份验证)

    【讨论】:

    • 根据迁移指南,在 0.11 版中,有 beforeConnect 而不是 onConnect。但它在 onConnect 工作时不起作用,尽管给出了错误或弃用。无论如何,此时,onConnect 在登录之前被调用,而我使用在身份验证之后创建的令牌。因此调用 chatController 的 操作并在查询参数z 中发送令牌。
    • 是的,肯定是这个地方。所以你解决了你的问题?还是需要更多信息?
    • 仍然需要信息 cz 我未能自定义这些事件,这就是为什么 m 使用 ocntroller 的路由而不是这些内置函数。
    【解决方案2】:

    config/sockets.js 中删除您的onConnect 和dicconnect 函数。

    【讨论】:

      猜你喜欢
      • 2011-09-27
      • 1970-01-01
      • 2016-01-03
      • 2012-02-06
      • 2016-05-20
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多