gpt4 book ai didi

node.js - socket.io 发出多次触发的事件

转载 作者:搜寻专家 更新时间:2023-10-31 23:35:19 24 4
gpt4 key购买 nike

我在这里阅读了一些关于这个主题的问题,但我还不确定如何解决我的问题。 getMsgs emit 事件触发的次数与我访问 /admin url 的次数一样多。我从关于 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');
});

最佳答案

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

关于node.js - socket.io 发出多次触发的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30697036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com