如何在Sails.js中的所有页面上监听login用户的套接字更新?
我有一个Sails.js应用程序。
每个页面中有当前设置的select(在布局中设置)。
我需要能够监听当前更改的事件的所有页面,并通知用户刷新页面。 我可以在客户端调用io.socket.on('currentChanged')
,只需在CurrentController.changed
运行一个发射器。 还是我特别需要听当前的控制器,并包裹在一个if(req.isSocket)
的响应?
我如何确保只通知用户,而不是每个人?
有没有更好的办法? 我不想为每个监听器添加相同的套接字响应。
我已经看遍了所有的堆栈溢出和谷歌,不能像这样一个听众一次所有的网页。
编辑:我知道我可以使用req.socket.handshake.sessionID
获取会话ID。 我可以得到原始套接字,但我宁愿这样'sails.js'的方式。
此外,在这个链接,这表明我可以join一个房间使用用户ID。 我应该这样做login
那么,我已经回答了这个问题,但是对于你的情况可以这样修改:
您最好为用户创build不同的房间。
创build一个控制器:
NotificationsController.js
module.exports = { subscribe: function(req, res) { // Get userId of user by your method ..... ..... var roomName = 'user_' + userId; sails.sockets.join(req.socket, roomName); res.json({ room: roomName }); } }
某处你可以创build通知:
var roomNameForUser = 'user_' + userId; sails.sockets.blast(roomNameForUser, 'currentChanged');
在你看来:
io.socket.on('connect', function(){ io.socket.get('/notifications/subscribe', function(data, jwr){ if (jwr.statusCode == 200){ io.socket.on(data.room,function(obj){ console.log(obj); }); } else { console.log(jwr); } }); });
你也必须添加策略config / policies.js,如:
'NotificationsController': { '*': ['passport', 'sessionAuth'] },
当然,如果你使用Passport或者Sails-auth。