即使当用户通过socket.io进行连接时,我也有以下订阅:
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事件(保存、删除等)附加了猫鼬事件处理程序。并在发生时发出套接字消息。这是代码:
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);
}当客户端断开连接时,将执行以下代码:
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(“订阅”);//销毁这里的处理程序}
发布于 2016-08-24 13:27:57
感谢你的洞察力,有时候你只是盯着一个问题,然后意识到答案是直截了当的。我差不多照你说的做了,只注册了一次item.socket。然而,与其保留一个套接字列表,我们只是使用socket.io方式将消息发送到正确的套接字,代码如下:
'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是客户在订阅时加入的房间。堵漏!谢谢:-)
发布于 2016-08-23 15:34:21
一个可能的解决办法如下。您可以维护连接在"item.socket“中的套接字的集合。然后,"item.socket“将导出函数,以从该集合中添加和删除套接字。因此,您将在代码中“要求”item.socket一次,然后在建立连接时使用套接字调用其add方法。类似地,当套接字断开连接时,您将使用套接字调用它的remove方法。item.socket中的猫鼬事件处理程序应该在套接字集合中迭代,并在适用的情况下发出消息。如果以加载多个实例的方式“需要”模块,则最好将套接字集合附加到全局命名空间。
https://stackoverflow.com/questions/39047594
复制相似问题