You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

关键修改说明

  1. 移除路由里的重复事件绑定:把原本在r_stores.js中router.get回调里的connection监听完全删掉,只在app.js里保留一次全局绑定,这样就不会重复注册监听器了。
  2. 用房间实现业务隔离:在连接建立时让socket加入stores_room,之后在路由里如果需要给stores相关的客户端发消息,直接通过req.app.io.to('stores_room')定向发送就行,既满足业务需求,又不会出现重复触发的问题。

这样修改后,你再刷新页面,控制台就只会输出一条IO APP CONNECTED,消息也不会重复发送啦!

内容的提问来源于stack exchange,提问作者Ali Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:51:59