socket.io多次触发事件

时间:2015-06-07 18:31:32

标签: node.js socket.io

我已经在这里读了几个关于这个问题的问题,但我不确定如何解决这个问题。 getMsgs emit事件的触发次数与我访问/admin网址的次数相同。我从SO上的其他问题中知道这是因为每次访问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');
});

2 个答案:

答案 0 :(得分:6)

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连接进行连接。

答案 1 :(得分:0)

尝试使用socket.removeAllListeners()