我正在尝试使用 Node.js、express 和 sockets.io 创建一个新闻源。
我的问题是它socket.on("connection", function{});
没有给你会话ID,所以我无法知道连接了哪个用户。我想知道是否有办法在会话连接时传递用户 ID。
我考虑过从客户端连接套接字,在与用户 ID 连接后立即向服务器发送消息,服务器在收到带有用户 ID 的消息后发回正确的新闻提要项目。
我想知道是否有更好/更可扩展/有效的方法来做到这一点。
如果您将授权 socket.io 请求,那么您可以过滤用户。
您必须序列化、反序列化用户对象才能使用 socket.io 访问属性
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
看看passportSocketIO。您可以像这样为传入的 socket.io 请求设置授权。
sio.set("authorization", passportSocketIo.authorize({
key: 'express.sid', //the cookie where express (or connect) stores its session id.
secret: 'my session secret', //the session secret to parse the cookie
store: mySessionStore, //the session store that express uses
fail: function(data, accept) { // *optional* callbacks on success or fail
accept(null, false); // second param takes boolean on whether or not to allow handshake
},
success: function(data, accept) {
accept(null, true);
}
}));
然后你可以像这样在“连接”回调中过滤掉用户。
sio.sockets.on("connection", function(socket){
console.log("user connected: ", socket.handshake.user.name);
//filter sockets by user...
var userProperty = socket.handshake.user.property, //property
// you can use user's property here.
//filter users with specific property
passportSocketIo.filterSocketsByUser(sio, function (user) {
return user.property=== propertyValue; //filter users with specific property
}).forEach(function(s){
s.send("msg");
});
});