Node.js Socket.io页面刷新时连接数递增问题求助
解决Socket.io连接数递增、消息重复发送的问题
嘿,我来帮你搞定这个Socket.io连接重复的问题!你遇到的情况是客户端每次刷新页面,Socket.io的连接数就会递增,发送消息时还会重复发送,从控制台日志也能看出来,每次刷新都会多一条IO STORES CONNECTED——这问题的根源其实很明确,咱们一步步来捋:
问题原因
你在r_stores.js的路由GET请求处理函数里,重复绑定了Socket.io的connection事件!每次客户端访问/stores路由(包括刷新页面时触发的请求),都会给req.app.io再注册一个新的connection事件监听器。当新的Socket连接建立时,所有已经注册的监听器都会被执行,所以每次刷新就多一条日志,消息自然也会重复发送。
解决方案
核心思路就是只在主文件(app.js)里绑定一次connection事件,绝对不要在路由的请求处理逻辑里重复绑定。如果需要在路由中处理Socket相关业务,用Socket.io的「房间(Room)」机制来实现就好。
修改后的代码
app.js 文件
var express = require('express'); var app = express(); const stores = require('./routes/r_stores'); var server = require('http').createServer(app); var io = require('socket.io')(server); app.io = io; // 只在这里绑定一次 connection 事件,全局生效 io.on('connection', function(socket){ console.log("IO APP CONNECTED "); // 让连接的socket加入stores专属房间,方便后续路由里定向发消息 socket.join('stores_room'); socket.on('disconnect',function(){ console.log("IO APP DISCONNECT "); }) }) app.use('/stores',stores); server.listen(3080, function () { console.log('listening on port 3080'); });
r_stores.js 文件
var express = require('express'); var router = express.Router(); router.get('/', function (req, res, next) { // 如果需要给stores相关的客户端发消息,直接通过房间发送即可 // 示例:req.app.io.to('stores_room').emit('update_stores', '新的店铺数据'); res.send('Stores page'); }) module.exports = router;
关键修改说明
- 移除路由里的重复事件绑定:把原本在
r_stores.js中router.get回调里的connection监听完全删掉,只在app.js里保留一次全局绑定,这样就不会重复注册监听器了。 - 用房间实现业务隔离:在连接建立时让socket加入
stores_room,之后在路由里如果需要给stores相关的客户端发消息,直接通过req.app.io.to('stores_room')定向发送就行,既满足业务需求,又不会出现重复触发的问题。
这样修改后,你再刷新页面,控制台就只会输出一条IO APP CONNECTED,消息也不会重复发送啦!
内容的提问来源于stack exchange,提问作者Ali Hassan
相关产品推荐
相关产品推荐

