如何在sails控制器中获取当前套接字对象或id?

时间:2017-08-01 07:26:04

标签: node.js sockets sails.js sails.io.js

我想在 sails.js(v0.12)控制器函数中访问当前连接的套接字ID。 sails.sockets.getId(req.socket);显示未定义,因为这不是套接字请求

我的目标是在用户成功登录后在数据库中设置我的用户的在线状态

login: function (req, res) {

    Util.login(req, function(){
        var socketId = sails.sockets.getId(req.socket);
        console.log('socketId ===', socketId); // return undefined
    });
},

基本上我想在控制器中访问当前用户的套接字对象,或者使用套接字on方法访问当前用户的会话对象

  

另外我不确定如何重写旧的套接字.onConnect   处理

 onConnect: function(session, socket) {
// Proceed only if the user is logged in

if (session.me) {
    //console.log('test',session);

    User.findOne({id: session.me}).exec(function(err, user) {
        var socketId = sails.sockets.getId(socket);

        user.status = 'online';
        user.ip = socket.handshake.address;

        user.save(function(err) {
          // Publish this user creation event to every socket watching the User model via User.watch()
          User.publishCreate(user, socket);
        });

        // Create the session.users hash if it doesn't exist already
        session.users = session.users || {};

        // Save this user in the session, indexed by their socket ID.
        // This way we can look the user up by socket ID later.
        session.users[socketId] = user;

        // Persist the session
        //session.save();

        // Get updates about users being created
        User.watch(socket);

        // Send a message to the client with information about the new user
        sails.sockets.broadcast(socketId, 'user', {
          verb :'list',
          data:session.users
        });
    });
}
},

1 个答案:

答案 0 :(得分:2)

您需要将req对象传递给方法。

if (req.isSocket) {
    let socketId = sails.sockets.getId(req);
    sails.log('socket id: ' + socketId);
}

由于请求不是套接字请求,您可能需要执行类似

的操作
  • 登录后向客户端发回一些标识符。
  • 使用标识符加入会议室。 (每个房间一个用户。)
  • 每当您需要向客户发送消息时,使用标识符向房间广播消息。

https://gist.github.com/crtr0/2896891

更新

来自风帆migration guide

  

不推荐使用onConnect生命周期回调。相反,如果在连接新套接字时需要执行某些操作,请从新连接的客户端发送请求以执行此操作。 onConnect的目的始终是为了优化性能(无需对服务器进行初始额外的往返),但其使用可能会导致混乱和竞争条件。如果你迫切需要消除服务器往返,你可以直接在sails.io.on(' connect',function(newlyConnectedSocket){})中绑定一个处理程序在你的bootstrap函数中(config / bootstrap.js) 。但请注意,这是不鼓励的。除非您面临真正的生产性能问题,否则您应该使用上面提到的策略进行连接"连接"逻辑(即在套接字连接后从客户端发送初始请求)。套接字请求是轻量级的,因此这不会给您的应用程序增加任何有形的开销,并且它将有助于使您的代码更具可预测性。

// in some controller
if (req.isSocket) {
    let handshake = req.socket.manager.handshaken[sails.sockets.getId(req)];
    if (handshake) {
        session = handshake.session;
    }
}