我想在 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
});
});
}
},
答案 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;
}
}