如何删除socket.io中的所有/单个事件列表器

时间:2017-12-28 22:00:48

标签: node.js sockets socket.io hapijs eventemitter

我正在使用socket.io在我的应用程序中使用hapijs进行实时功能。当我尝试在hapijs路由中添加服务器端的列表,如果我重新加载相同的路由/页面10次或更多,那么它开始向我显示错误(node:9004) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 board_5a40a863a7fbf12cf8a7f1b8_element_sorted listeners added. Use emitter.setMaxListeners() to increase limit。您还可以在附加的屏幕截图中看到错误。 enter image description here

我首先尝试了以下每个代码来删除列表,然后使用socket.on('eventname', callback)将其添加回来:

io.sockets.removeListner("eventname")

io.removeListner("eventname")

socket.removeListner("eventname")

io.sockets.removeAllListners()

io.removeAllListners()

socket.removeAllListners()

但每次removeAllListners/removeListner is not a function我都会收到错误。 我还尝试使用以下每个代码将maxlistners的限制设置为无限制:

io.setMaxListeners(0);

io.sockets.setMaxListeners(0);

socket.setMaxListeners(0);

但我仍然得到memory leak detected的同样错误。那么有人可以告诉我解决方案。我最好先遵循先删除事件监听器然后再设置它的方法。但我不知道需要调用哪个函数。 :(

此外,我还想了解更多信息,这是一种好方法,是为每个用户创建一个新的独特事件监听器,而不是为所有用户创建一个公共事件监听器吗?

例如,我有一个拥有100万用户的聊天应用。

  1. 现在,在第一种方法中,我将为100万用户创建100万个事件监听器。因此,只要有来自用户的新消息,那么只有那些用户才能从与该用户聊天的服务器获得ping。
  2. 在第二种方法中,我将为所有用户创建一个公共事件监听器,但现在服务器现在必须ping 100万用户,我将不得不解析每次在客户端收到的消息,并检查消息是否是为我或其他人。 根据我的说法,由于安全问题,第二种方法不应该是一种好方法,因为错误/未经授权的用户可能会收到消息。
  3. 但我仍然不确定应该遵循哪一个。 所以,任何人都可以指导我这件事。任何帮助表示赞赏。

0 个答案:

没有答案