1

我想在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方法中访问当前用户的会话对象

另外我不确定如何重写我的旧sockets.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
        });
    });
}
},
4

1 回答 1

2

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

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

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

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

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

更新:

从风帆迁移指南

onConnect 生命周期回调已被弃用。相反,如果您需要在连接新套接字时执行某些操作,请从新连接的客户端发送请求以执行此操作。onConnect 的目的始终是优化性能(消除与服务器进行初始额外往返的需要),但它的使用可能会导致混乱和竞争条件。如果您迫切需要消除服务器往返,您可以在引导函数 (config/bootstrap.js) 中直接在sails.io.on('connect', function (newlyConnectedSocket){}) 上绑定一个处理程序。但是,请注意,这是不鼓励的。除非您面临真正的生产性能问题,否则您应该将上述策略用于您的“连接时”逻辑(即在套接字连接后从客户端发送初始请求)。

// in some controller
if (req.isSocket) {
    let handshake = req.socket.manager.handshaken[sails.sockets.getId(req)];
    if (handshake) {
        session = handshake.session;
    }
}
于 2017-08-01T07:58:41.657 回答