gpt4 book ai didi

javascript - 无法发送到特定客户端 : Socket IO sends it to every client?

转载 作者:搜寻专家 更新时间:2023-10-31 23:44:29 29 4
gpt4 key购买 nike

是的,我看过文档,写得很好: Socket IO Cheatsheet

这里是问题所在:当他的 Express App session 被销毁时,我想通知用户注销。现在这是正在发生的事情:当我从 session 中注销时,所有其他客户端(包括已经登录或尚未登录的客户端)都会收到一条消息,说明他们已注销。是的,我的 Express 应用程序运行良好 - 他们没有注销,但我相信 SOCKET IO 无论如何都会向他们发送消息。我运行了调试器,结果发现两个客户端也可以区分。

这是我的代码:

服务器.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);
});

用户 Controller .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' });

但事实证明它仍然向所有客户端发送。我很确定某处不匹配,只是无法弄清楚哪里。

最佳答案

如果你想发送发送给特定用户,你需要为每个 session ID 创建空间

io.on('connection', function (socket) {
app.set('current_socket', socket);
var sessionId = socker.request.session.id
//join room
socket.join(sessionId);
});

用户 Controller .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.sockets.in(sessionID).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.'
});
}
}
}

关于javascript - 无法发送到特定客户端 : Socket IO sends it to every client?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54060622/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com