连接在Socket.io中是重复的

时间:2014-02-23 22:58:36

标签: javascript jquery node.js socket.io

我正在开发一个聊天应用,并且连接正在重复。

在我的路线中,我有:

exports.index = function (io) {

  return function (req, res) {

    var userId;

    res.render('index', {
      title: 'RandomChat.me',
      test: 'test2'
    });

    io.sockets.on('connection', function (socket) {

      userId = socket.id;
      console.log("+++++++++++++++++++" + userId);
      socket.emit('addUser', { userId: userId });
      socket.room = 'General';
      socket.join(socket.room);

      socket.on('sendMessage', function (data) {
        console.log(data.room);
        // socket.broadcast.emit('receiveMessage', { data: data });
        socket.broadcast.to(data.room).emit('receiveMessage', { message: data.message });
      });

    });

  }

};

客户端之类的东西:

  var socket = io.connect('http://domain.com:3000'); 
  var userId;

  socket.on('addUser', function(data) {
    userId = data.userId;
    console.log(userId);
  });

  socket.on('receiveMessage', function (data) {
    console.log(data);
  });

  var room: "General";
  var message: "Test";
  socket.emit('sendMessage', { room : room, message: message });
  console.log(userId + " " + message)

如果我去应用程序并检查控制台日志,我会看到userId,当我重新加载页面时,我看到相同的ID两次,如果我再次重新加载,我会看到它3次,依此类推。

在node.js控制台中也发生了同样的事情。

所以基本上当连接/用户重复时,其他用户会收到重复的消息,因为sendMessage / receiveMessages函数不止一次运行。

帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

使用io.sockets.once('connection', function (data){})代替io.sockets.on('connection', function (data){})修复它。它不会尝试恢复丢失的连接。

答案 1 :(得分:0)

问题在于这一行

io.sockets.on('connection', function (socket) {

您不应将这些放在请求处理程序中,因为为每个请求添加socket的连接处理程序是错误的。尝试在请求处理程序之外执行这些操作,并使用io对象从请求处理程序向套接字发出/广播事件。