首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >socket.io发出事件多次触发

socket.io发出事件多次触发
EN

Stack Overflow用户
提问于 2015-06-08 02:31:32
回答 2查看 10.3K关注 0票数 4

我在这里读了一些关于这个主题的问题,但我还不确定如何在我的情况下解决它。getMsgs emit事件的触发次数与我访问/admin url的次数一样多。我从其他问题中得知,这是因为每次我访问admin页面时侦听器都会注册,但我不确定如何重构我的代码(例如,将io.on(..)移到哪里以及如何从router.get('/admin'..)函数调用它。

代码语言:javascript
运行
复制
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');
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-08 05:05:27

io.on(...)代码移到路由之外。每次命中/admin路由时,您都会重新注册一个新的事件处理程序,因此您将为完全相同的事件获得多个事件处理程序。

代码语言:javascript
运行
复制
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连接。

票数 8
EN

Stack Overflow用户

发布于 2020-10-06 22:53:08

尝试使用socket.removeAllListeners()

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

https://stackoverflow.com/questions/30697036

复制
相关文章

相似问题

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