我已经在这里读了几个关于这个主题的问题,但我不确定如何解决这个问题.getMsgs当我访问/adminurl时,emit事件被触发多次.我从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');
});
Run Code Online (Sandbox Code Playgroud)
将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);
});
});
});
Run Code Online (Sandbox Code Playgroud)
如果您不希望在/admin它命中的路由之前安装socket.io事件处理程序,那么您可以保留一个标志,表明它们是否已设置.
如果您只希望socket.io事件处理程序应用于特定的管理客户端,那么您将需要使用某种身份验证的不同方法来决定是否允许socket.io连接进行连接.