套接字IO房间和名单

我试图显示一个用户列表,并计算一个MEAN栈应用程序中的一个聊天室中的用户数量。 不幸的是,我遇到了一个非常严重的问题。 每当新用户进入聊天室时,用户数量都会重置。 即使新用户进入房间,我希望聊天室中的当前成员仍然坚持。

这里是服务器端代码:

io.on('connection', function(socket){ var users = []; var username = ''; var room = ''; console.log('a user has connected'); socket.on('join-room', function(data){ socket.join(data.room); room = data.room; }); socket.on('request-users', function(){ socket.to(room).emit('users', {users: users}); console.log(users); }); socket.on('add-user', function(data){ io.to(room).emit('add-user', { username: data.username }); username = data.username; users.push(data.username); }); socket.on('disconnect', function(data){ console.log(username + ' has disconnected'); users.splice(users.indexOf(username), 1); io.to(room).emit('remove-user', {username: username}); }); }); 

这是使用btford-socket.io的angular度控制器:

 angular.module('chatApp').controller('chatController', ['$scope', 'Socket','$cookies', '$rootScope', '$stateParams', function($scope, Socket, $cookies, $rootScope, $stateParams){ Socket.connect(); $scope.room = $stateParams.room; Socket.emit('join-room', {room:$stateParams.room}); console.log($stateParams.room); $scope.users = []; if($cookies.get('token') && $cookies.get('currentUser')){ console.log($cookies.get('currentUser')); Socket.emit('add-user', {username: $rootScope.currentUser}); } else { bootbox.alert('You need to sign in to chat'); } Socket.emit('request-users', {}); Socket.on('users', function(data){ $scope.users = data.users; }); Socket.on('add-user', function(data) { $scope.users.push(data.username); $scope.messages.push({username: data.username, message: 'has arrived'}); }); Socket.on('remove-user', function(data){ $scope.users.splice($scope.users.indexOf(data.username),1); $scope.messages.push({username: data.username, message: 'has left the building'}); }); $scope.$on('$locationChangeStart', function(event){ Socket.disconnect(true); }) }]); 

最后是HTML:

 <div class="col-md-2" id="user-list"> <p>Number of connected users: {{users.length}}</p> <ul> <li ng-repeat="user in users track by $index">{{user}}</li> </ul> <div class="fixed"></div> </div> 

所以我很确定这是发生了什么事情。 每个用户都有自己的套接字连接,但是当新用户连接时,它会将此消息广播给每个人。 意思是它会重置每个人的variables。 在连接函数之外的应用程序中声明你需要的variables。