Express JS中的Socket.io连接执行多次

时间:2017-03-28 06:17:12

标签: javascript node.js express socket.io

我引用this repo来集成socket.io。

我想要实现的是倒数计时器,每秒发送给客户端,setInterval在服务器端运行。我得到的结果是

Socket.io & Express JS

终端有on.('connection'),第一次刷新页面时,它执行了4次on.('connection'),倒计时工作正常。然后我刷新第二次,它执行了8次on.('connection'),倒数计时器也有2个值。然后继续...... 12次,16次......

app.js

app.use(function(req, res, next){
  res.io = io; 
  io.on('connection', function(socket) {
    console.log(socket.id + ' connected.');
  }); 
  next();
});

routes / users.js

router.get('/', function(req, res, next) {

  models.User.findAll({
    include: [ {model: models.Task, as: 'tasks'} ]
  }).then(function(users) {

    var eventTime= new Date('2017-03-31 13:00:00').getTime();
    var currentTime = new Date().getTime();
    var diffTime = eventTime - currentTime;
    var duration = moment.duration(diffTime*1000, 'milliseconds');
    var interval = 1000;

    setInterval(function() {
      duration = moment.duration(duration - interval, 'milliseconds');
      res.io.emit('countdown', { time_left: duration.hours() + ":" + duration.minutes() + ":" + duration.seconds() }); 
    }, interval);

    res.render('users', {
      title: 'Sequelize: Express Example',
      users: users
    });   
  });   
});

这里出了什么问题?

2 个答案:

答案 0 :(得分:4)

我找到了答案here

io.on('connection', function(socket) {
  socket.removeAllListeners(); <---------- ADD THIS LINE
  console.log(socket.id + ' connected.');
}); 

答案 1 :(得分:-1)

我认为您可能在setInterval中保留io.on('connection')事件。这就是为什么它每次都在* 2中继续复制。

如果你想要实现倒数计时器,你可以这样做:

io.on('connection', function (socket){
  var tick = 0;
  setInterval(function(){

    socket.emit('timer', tick++)
  }, 1000);
}) 

现在您可以在前端收听timer事件并显示结果。 感谢