javascript - Socket.io 在页面刷新时创建多个连接
问题描述
我正在创建一个聊天室,但每次页面刷新后,都会建立更多的连接。例如,如果我转到我的聊天室页面,则只会创建一个连接。但是,在我刷新一次后,现在连接了 2 个客户端。每次页面刷新后,都会添加一个连接。
这是我的聊天路线
/* GET home page. */
router.get('/', accessControl.ensureAuthenticated, function(req, res, next) {
const io = req.app.io;
console.log('const io created');
io.on('connection', function(socket){
console.log(' %s sockets connected', io.engine.clientsCount);
console.log('[NodeApp] (socket.io) A client has connected');
socket.on('chat message', function(message){
if (message.sessionID == req.session.id) {
io.emit('chat message', message);
console.log('message: ' + message.message);
} else {
console.log('client sessionID ('+message.sessionID+') does not match server sessionID ('+req.session.id+')');
}
});
socket.on('disconnect', function(){
console.log('[NodeApp] (socket.io) A client has disconnected');
socket.disconnect();
});
});
res.render('chat/index', {
title: "Chat",
//send session id for client verification
sessionID: req.session.id,
});
});
刷新聊天页面3次后的输出:
const io created
1 sockets connected
[NodeApp] (socket.io) A client has connected
const io created
[NodeApp] (socket.io) A client has disconnected
1 sockets connected
[NodeApp] (socket.io) A client has connected
1 sockets connected
[NodeApp] (socket.io) A client has connected
const io created
[NodeApp] (socket.io) A client has disconnected
[NodeApp] (socket.io) A client has disconnected
1 sockets connected
[NodeApp] (socket.io) A client has connected
1 sockets connected
[NodeApp] (socket.io) A client has connected
1 sockets connected
[NodeApp] (socket.io) A client has connected
message: test message (should be sent 3 times)
message: test message (should be sent 3 times)
message: test message (should be sent 3 times)
解决方案
你不能这样说:
io.on('connection', function(socket){...}
在路由处理程序内部。每次命中该路由时,您都会为该事件创建另一个侦听器,因此它们会堆积很多重复项,因此您在所有这些重复的事件处理程序中多次处理每条消息。
您需要将其放在任何路由处理程序之外。socket.io 服务器及其侦听器需要在配置 socket.io 服务器时进行配置,而不是在路由处理程序中。
推荐阅读
- java - 如何存储识别出的人脸,以便在应用程序关闭时和在不同设备上使用它们
- html-table - 在 MDX 中查找与目标的销售比率
- javascript - 如何自定义脚本以在单个页面上工作
- php - 一个使用 HTML 表单的 php 中的简单数字猜测程序
- mysql - 尝试在空对象引用上调用虚拟方法 getDatabasePath(java.lang.String)'
- java - 使用 DriverManager 类设置 jdbc 拦截器
- google-apps-script - 用户删除 G-Suite 插件时如何删除用户财产服务
- php - 致命错误:尝试将文件上传到 AWS 时未捕获 InvalidArgumentException
- rest - PUT 方法的请求模型是否应该与 GET 方法的响应模型是同一类?
- python - Python从elf文件中的字节读取位