Node Express设计用于避免Socket.io中的多个客户端

时间:2014-02-02 08:59:57

标签: node.js express socket.io

使用帖子和评论构建一个简单的应用程序。

用户点击帖子并添加评论,每个查看同一帖子的人都会看到新评论添加到帖子中。全部通过Socket.io完成。

这是我实例化它的方式:

// app.js
var io = require('socket.io').listen(app.listen(app.get('port')));

var chat = io.of('/p/' + id).on('connection', function(socket) {
      socket.on('addComment', function(data) {
        var content = data.comment;
        var comment = new commentModel({
          user: req.user._id,
          post_id: id,
          content: content
        });
        comment.save(function(err, doc) {
          if (err) {
            return next(err);
          }
          commentModel.findById(doc._id).populate('user').exec(function(err, comment) {
            chat.emit('newComment', {
              comment: comment
            });
          });
        });
      });
    });

// client-side JS
self.socket_io = io.connect(window.location.href);
self.socket_io.on('newComment', function(data) {
    // do stuff with the new comment
};

第一次点击页面时,评论会提交一次(一个套接字连接),但是,如果我刷新页面并提交新评论,则会创建两个评论(每个连接的客户端一个)。

我出错的任何想法?

3 个答案:

答案 0 :(得分:0)

确实 commentModel.findById

nede to be comment.findByID ?

答案 1 :(得分:0)

您可以尝试其中一些:

管理服务器上的套接字会话:socketio_session[user_id].push(session)。 将允许您访问为特定用户连接的所有会话。在存储新会话之前,您可能不需要存储每个用户的会话列表,只需存储最新会话,并强制断开现有会话。

-

这列出了一些内容,包括更改强制新连接的配置
https://github.com/LearnBoost/socket.io/issues/474

-

这也可能有用,解释了如何使用express提取套接字中的会话ID:
http://www.danielbaulig.de/socket-ioexpress/

答案 2 :(得分:0)

我认为这可能会帮助您在每次用户刷新时创建新的套接字连接

https://github.com/wcamarao/session.socket.io/