Socket.IO:如何删除命名空间

Fre*_*rik 7 namespaces node.js socket.io socket.io-1.0

我需要能够即时构建和销毁socket.io名称空间.很容易找到如何创建命名空间的信息,但我没有发现如何删除/断开命名空间以释放其内存.

假设我已经运行了以下代码:

var nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
  console.log('someone connected'):
});
nsp.emit('hi', 'everyone!');
Run Code Online (Sandbox Code Playgroud)

如何断开/删除上面创建的socket.io命名空间?

mit*_*1os 30

实际上只是从服务器nsps阵列中删除命名空间你不会释放任何内存和套接字仍将保持连接,因为仍然有指向内存中的命名空间的指针,所以它不会被垃圾收集...如果你想要的是完全清空你应该的资源

  1. 断开所有套接字与特定名称的连接
  2. 删除所有事件侦听器,因为它是一个EventEmitter扩展类
  3. 从服务器中的nsps数组中删除它

例如

const MyNamespace = io.of('/my-namespace'); // Get Namespace
const connectedNameSpaceSockets = Object.keys(MyNamespace.connected); // Get Object with Connected SocketIds as properties
connectedNameSpaceSockets.forEach(socketId => {
    MyNamespace.connected[socketId].disconnect(); // Disconnect Each socket
});
MyNamespace.removeAllListeners(); // Remove all Listeners for the event emitter
delete io.nsps['/my-namespace']; // Remove from the server namespaces
Run Code Online (Sandbox Code Playgroud)

  • 它只能解决一个问题,“ connectedNameSpaceSockets [socketId] .disconnect();”应该改为“ MyNamespace.connected [socketId] .disconnect()”。 (3认同)

Der*_*erM 7

io.of方法只创建一个数组元素:

Server.prototype.of = function(name, fn){
  if (String(name)[0] !== '/') name = '/' + name;

  if (!this.nsps[name]) {
    debug('initializing namespace %s', name);
    var nsp = new Namespace(this, name);
    this.nsps[name] = nsp;
  }
  if (fn) this.nsps[name].on('connect', fn);
  return this.nsps[name];
};
Run Code Online (Sandbox Code Playgroud)

所以我假设您可以从socket io中的数组中删除它.我测试它非常快,似乎工作.已连接的插座,保持连接状态.

delete io.nsps['/my-namespace'];
Run Code Online (Sandbox Code Playgroud)

/my-namespace然后连接到默认命名空间.我不知道这是不是一个好的解决方案,但也许你可以玩这个...

  • 检查另一个答案,这个不能正常工作. (3认同)