首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Socket.io泄漏-如何删除已注册onConnect的猫鼬事件侦听器?

Socket.io泄漏-如何删除已注册onConnect的猫鼬事件侦听器?
EN

Stack Overflow用户
提问于 2016-08-19 21:00:05
回答 2查看 529关注 0票数 0

即使当用户通过socket.io进行连接时,我也有以下订阅:

代码语言:javascript
复制
    socket.on('subscribe', function(room) {
    console.log('joining room', room.id);
    socket.join(room.id);
    socket.roomName = room.id;

    // Insert sockets below
    require('../api/item/item.socket').register(socket);
  });

"item.socket“代码为db事件(保存、删除等)附加了猫鼬事件处理程序。并在发生时发出套接字消息。这是代码:

代码语言:javascript
复制
var Item = require('./it');

exports.register = function(socket) {
  Item.schema.post('save', function (doc) {
    console.log("hit save message");
    onSave(socket, doc);
  });
  Item.schema.post('update', function (doc) {
    console.log("hit update message");
    onSave(socket, doc);
  });
  Item.schema.post('remove', function (doc) {
    onRemove(socket, doc);
  });
};

function onSave(socket, doc, cb) {
  socket.emit(doc._id + ':item:save', doc);
}

function onRemove(socket, doc, cb) {
  socket.emit(doc._id + ':item:remove', doc);
}

当客户端断开连接时,将执行以下代码:

代码语言:javascript
复制
function onDisconnect(socket) {
  console.log('disconnected: ' + socket.roomName);
  socket.leave(socket.roomName);
  socket.removeAllListeners("subscribe");
}

我遇到的基本问题是,如果用户连接get,item.socket猫鼬处理程序向他们发送有关模型更改的更新。当它们断开连接时(重新加载页面,离开,返回,等等)那个连操纵者都不会消失的。例如,我更改为"item“,如果我重新加载页面10次,我将得到10条”点击保存“消息。

理想情况下,当客户端离开页面时,该猫鼬处理程序将被销毁,因此它不会试图向任何人发送消息。

编辑:我非常清楚,这是一个事件处理程序泄漏。基本上我需要做点什么在断开的时候摧毁处理程序。我需要以某种方式创建对require('../api/item/item.socket').register(socket);的引用,然后删除它,但我想不出如何正确地使用猫鼬模型和设置它的方式。

函数onDisconnect(套接字){console.log(‘断开连接:’+ socket.roomName);socket.leave(socket.roomName);socket.removeAllListeners(“订阅”);//销毁这里的处理程序}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-24 13:27:57

感谢你的洞察力,有时候你只是盯着一个问题,然后意识到答案是直截了当的。我差不多照你说的做了,只注册了一次item.socket。然而,与其保留一个套接字列表,我们只是使用socket.io方式将消息发送到正确的套接字,代码如下:

代码语言:javascript
复制
'use strict';

var Item = require('./item.model');

var log4js = require('log4js');
var logger = log4js.getLogger();

exports.register = function(socketio) {
  Item.schema.post('save', function (doc) {
    logger.debug("hit save message " + doc._id);
    onSave(socketio, doc);
  });
  Item.schema.post('update', function (doc) {
    logger.debug("hit update message");
    onSave(socketio, doc);
  });
  Item.schema.post('remove', function (doc) {
    onRemove(socketio, doc);
  });
};

function onSave(socketio, doc, cb) {
  socketio.sockets.in(doc._id).emit(doc._id + ':item:save', doc);
}

function onRemove(socketio, doc, cb) {
  socketio.sockets.in(doc._id).emit(doc._id + ':item:remove', doc);
}

其中,doc._id是客户在订阅时加入的房间。堵漏!谢谢:-)

票数 0
EN

Stack Overflow用户

发布于 2016-08-23 15:34:21

一个可能的解决办法如下。您可以维护连接在"item.socket“中的套接字的集合。然后,"item.socket“将导出函数,以从该集合中添加和删除套接字。因此,您将在代码中“要求”item.socket一次,然后在建立连接时使用套接字调用其add方法。类似地,当套接字断开连接时,您将使用套接字调用它的remove方法。item.socket中的猫鼬事件处理程序应该在套接字集合中迭代,并在适用的情况下发出消息。如果以加载多个实例的方式“需要”模块,则最好将套接字集合附加到全局命名空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39047594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档