在MEAN.js中使用Socket.io命名空间4.2

时间:2016-03-03 19:25:46

标签: angularjs node.js socket.io mean-stack meanjs

我正在使用MEAN.js 4.2构建一个应用程序,并且我正在尝试使用Socket.io让服务器发出UI将实时响应的某些消息。例如,当服务器将Note发布到用户的Notebook时,Notebook将刷新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 ='/'。

如果我在默认命名空间中发出事件,一切都很完美......除了事件发送到连接到默认命名空间的每个客户端。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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