【发布时间】:2019-06-01 07:19:40
【问题描述】:
是的,我浏览了文档,写得很好: Socket IO Cheatsheet
问题出在:当 Express 应用程序的会话被销毁时,我想通知用户注销。现在正在发生这种情况:当我从会话中注销时,所有其他客户端(包括已登录或尚未登录的客户端)都会收到一条消息,说明他们已注销。是的,我的快速应用程序运行良好——他们没有被注销,但我相信 SOCKET IO 无论如何都会向他们发送消息。我运行了调试器,结果发现两个客户端也是可以区分的。
这是我的代码:
server.js:
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.set('socketio', io);
io.on('connection', function (socket) {
app.set('current_socket', socket);
console.log('No of clients:', io.engine.clientsCount);
});
userController.js:
exports.userLogout = function(req, res, next) {
const sessionID = req.session.id;
const io = req.app.get('socketio');
const this_socket = req.app.get('current_socket');
req.session.destroy(function (err){
if(err) {
console.error("userLogout failed with error:", err);
return next(err);
}
else {
console.log("this_socket:", this_socket);
console.log("io:", io);
this_socket.emit('userAction', { action: 'logout' });
//other logic to remove old sessions from DB Session Store
//and finally:
res.status(200)
.json({
status: 'success',
api_data: {'loggedIn':false},
message: 'Logout successful.'
});
}
}
}
我什至尝试过这个:
io.emit('userAction', { action: 'logout' });
但事实证明它仍然会发送给所有客户端。我很确定某处不匹配,只是不知道在哪里。
【问题讨论】:
-
@jfriend00 能给我一个详细的例子吗?
-
您正在对您的服务器进行编码,就像一次只有一个用户在您的服务器上做事一样。您不能将
current_socket存储在全局可用的位置。由于不同的用户在你的服务器上做不同的事情,这些会发生冲突。相反,您需要将用户状态存储在用户会话中或直接存储在 cookie 中,然后当针对该特定用户的请求发生时,您会从该用户的会话或 cookie 中获取状态。
标签: javascript node.js express socket.io