在 MEAN.js 4.2 中使用 Socket.io 命名空间
Using Socket.io Namespace in MEAN.js 4.2
我正在使用 MEAN.js 4.2 构建应用程序,并尝试使用 Socket.io 让服务器发出某些消息,UI 将实时响应这些消息。例如,当服务器向用户的笔记本发布一条注释时,笔记本将刷新其在 UI.
中的内容。
我想使用命名空间来确保我只向受影响的用户发送事件,并且该用户只收听相关事件。
在服务器上,我有:
var namespace = '/player-' + user._id; // whereas user._id is the user's unique id
var nsp = io.of(namespace);
nsp.emit('note.posted', note); // whereas note contains info about the posted note
然后,在客户端控制器上:
angular.module('myapp')
.controller('NotebookController', ['$scope', '$state', '$stateParams', '$http', 'Authentication', 'Notebook', 'Socket', function ($scope, $state, $stateParams, $http, Authentication, Notebook, Socket) {
...
var nsp = '/player-' + Authentication.user._id; // This gives me the same namespace as used on the server. I just don't know what to do with it.
if (!Socket.socket) {
Socket.connect();
}
Socket.on('note.posted', function (data) {
$scope.find(); // this just refreshes the list of notes in the UI
});
$scope.$on('$destroy', function () {
Socket.removeListener('note.posted');
});
...
因此,客户端名称空间仍然是“/”,因为我没有在任何地方连接到其他名称空间。确实,我在设置侦听器时验证了 Socket.socket.nsp = '/'。
如果我在默认命名空间中发出事件,一切都会正常运行...除了事件会发送到连接到默认命名空间的每个客户端。
有什么想法吗?
Socket.IO 中的名称空间并不意味着动态使用,就像您在这里所做的那样。看起来更像是在一台服务器上有不同的应用程序 运行。
你应该用的是房间。
服务器代码:
var room = 'player-' + user._id; // whereas user._id is the user's unique id
io.on('connection', function(socket){
socket.join(room);
});
// This is to send the note
io.to(room).emit('note.posted', note); // whereas note contains info about the posted note
我正在使用 MEAN.js 4.2 构建应用程序,并尝试使用 Socket.io 让服务器发出某些消息,UI 将实时响应这些消息。例如,当服务器向用户的笔记本发布一条注释时,笔记本将刷新其在 UI.
中的内容。我想使用命名空间来确保我只向受影响的用户发送事件,并且该用户只收听相关事件。
在服务器上,我有:
var namespace = '/player-' + user._id; // whereas user._id is the user's unique id
var nsp = io.of(namespace);
nsp.emit('note.posted', note); // whereas note contains info about the posted note
然后,在客户端控制器上:
angular.module('myapp')
.controller('NotebookController', ['$scope', '$state', '$stateParams', '$http', 'Authentication', 'Notebook', 'Socket', function ($scope, $state, $stateParams, $http, Authentication, Notebook, Socket) {
...
var nsp = '/player-' + Authentication.user._id; // This gives me the same namespace as used on the server. I just don't know what to do with it.
if (!Socket.socket) {
Socket.connect();
}
Socket.on('note.posted', function (data) {
$scope.find(); // this just refreshes the list of notes in the UI
});
$scope.$on('$destroy', function () {
Socket.removeListener('note.posted');
});
...
因此,客户端名称空间仍然是“/”,因为我没有在任何地方连接到其他名称空间。确实,我在设置侦听器时验证了 Socket.socket.nsp = '/'。
如果我在默认命名空间中发出事件,一切都会正常运行...除了事件会发送到连接到默认命名空间的每个客户端。
有什么想法吗?
Socket.IO 中的名称空间并不意味着动态使用,就像您在这里所做的那样。看起来更像是在一台服务器上有不同的应用程序 运行。
你应该用的是房间。
服务器代码:
var room = 'player-' + user._id; // whereas user._id is the user's unique id
io.on('connection', function(socket){
socket.join(room);
});
// This is to send the note
io.to(room).emit('note.posted', note); // whereas note contains info about the posted note