我试图将前端服务器连接到我们的通知服务,然后将前端服务器连接到浏览器。通知服务是实时的,并且在发送的通知数据中包括收件人用户ID。我发送数据的通知服务和接收数据的前端服务器没有问题。我可以让它连接并断开与浏览器的连接,就像这样:
io.on('connection', function (socket) {
console.log('connected');
socket.on('disconnect', function () {
console.log('disconnected');
});
});
我现在需要知道哪些用户已登录到前端服务器,因此我知道将通知发送到哪个用户/套接字。如果我将连接侦听器放在像这样的中间件函数中,我们可以从快速会话中获取这些数据:
var allClients = {};
function useSocket (req, res, next) {
io.on('connection', function (socket) {
allClients[req.session.userId] = socket;
socket.on('disconnect', function () {
console.log('disconnected');
allClients[req.session.userId].removeAllListeners();
// we were also suggested things like socket.close() which did not help
});
});
next();
}
app.get('*', useSocket, function (req, res){
res.render('../views/index');
});
除了上面的代码在每次浏览器刷新时创建一个新连接,因此用户会在任何浏览器已连接的情况下获得欺骗通知。
这是我与通知服务对话的代码:
var notificationServiceSocket = require('socket.io-client').connect(notificationServiceUrl);
notificationServiceSocket.on('notification', function (data) {
// data.user_id is the intended recipient
});
如何在不创建无限连接的情况下确定哪个套接字与收件人相关?