我在这里读了一些关于这个主题的问题,但我还不确定如何在我的情况下解决它。getMsgs emit事件的触发次数与我访问/admin url的次数一样多。我从其他问题中得知,这是因为每次我访问admin页面时侦听器都会注册,但我不确定如何重构我的代码(例如,将io.on(..)移到哪里以及如何从router.get('/admin'..)函数调用它。
router.get('/admin', function(req, res, next){
io.on('connection', function (socket) {
dal.findAllMessages(function(err, messages) {
console.log('sent msgs');
socket.emit('getMsgs', messages);
});
socket.on('newMsg', function(data){
console.log('newMsg');
console.log(data);
dal.addMessage(data);
dal.findAllMessages(function(err, messages) {
socket.emit('getMsgs', messages);
});
});
socket.on('delMsg', function(data){
console.log('delMsg');
console.log(data);
dal.deleteMessage(data);
dal.findAllMessages(function(err, messages) {
socket.emit('getMsgs', messages);
});
});
});
res.render('admin');
});发布于 2015-06-08 05:05:27
将io.on(...)代码移到路由之外。每次命中/admin路由时,您都会重新注册一个新的事件处理程序,因此您将为完全相同的事件获得多个事件处理程序。
router.get('/admin', function(req, res, next){
res.render('admin');
});
io.on('connection', function (socket) {
dal.findAllMessages(function(err, messages) {
console.log('sent msgs');
socket.emit('getMsgs', messages);
});
socket.on('newMsg', function(data){
console.log('newMsg');
console.log(data);
dal.addMessage(data);
dal.findAllMessages(function(err, messages) {
socket.emit('getMsgs', messages);
});
});
socket.on('delMsg', function(data){
console.log('delMsg');
console.log(data);
dal.deleteMessage(data);
dal.findAllMessages(function(err, messages) {
socket.emit('getMsgs', messages);
});
});
});如果您不希望在到达/admin路由之前安装socket.io事件处理程序,那么您可以保留一个标志,说明是否设置了这些处理程序。
如果您只希望socket.io事件处理程序应用于特定的管理客户端,那么您将需要一种不同的方法,该方法使用某种身份验证来决定是否允许连接socket.io连接。
发布于 2020-10-06 22:53:08
尝试使用socket.removeAllListeners()
https://stackoverflow.com/questions/30697036
复制相似问题