如何防止sockjs中每个页面刷新的新连接

时间:2014-07-23 10:50:41

标签: javascript websocket chat sockjs

因此,每次刷新页面时,似乎sockjs正在创建一个新连接。

我正在每个channel.onmessage将每条消息保存到我的mongodb,所以如果我刷新我的页面7次并发送消息,我会将7条相同内容的消息保存到我的mongodb中。

这是非常有问题的,因为当我进入聊天室时检索这些消息时,为了查看日志,我会看到一堆重复的消息。

我想跟踪所有“活动”的连接,如果用户尝试建立另一个连接,我想终止旧连接,因此每次只有一个连接监听每条消息。

我该怎么做?

var connections = {};

//creating the sockjs server
var chat = sockjs.createServer();

//installing handlers for sockjs server instance, with the same url as client
chat.installHandlers(server, {prefix:'/chat/private'});

var multiplexer = new multiplexServer.MultiplexServer(chat);

var configChannel = function (channelId, userId, userName){
  var channel = multiplexer.registerChannel(channelId);

  channel.on('connection', function (conn) {
    // console.log('connection');
    console.log(connections);
    connections[channelId] = connections[channelId] || {};

    if (connections[channelId][userId]) {
      //want to close the extra connection
    } else {
      connections[channelId][userId] = conn;
    }

    // }


    // if (channels[channelId][userId]) {
    //   conn = channels[channelId][userId];
    // } else {
    //   channels[channelId][userId] = conn;
    // }

    // console.log('accessing channel! ', channels[channelId]);

    conn.on('new user', function (data, message) {
      console.log('new user! ', data, message);
    });

    // var number = connections.length;

    conn.on('data', function(message) {
      var messageObj = JSON.parse(message);
      handler.saveMessage(messageObj.channelId, messageObj.user, messageObj.message);
      console.log('received the message, ', messageObj.message);
      conn.write(JSON.stringify({channelId: messageObj.channelId, user: messageObj.user, message: messageObj.message }));
    });
    conn.on('close', function() {
      conn.write(userName + ' has disconnected');
    });
  });
  return channel;
};

1 个答案:

答案 0 :(得分:0)

我解决像你这样的问题的方式是关闭和承诺,我不知道这是否可以帮助你。我告诉你帮助我的代码,这是Vertx的EventBus:

window.Events = (function NewEvents() {
  var eventBusUrl = $('#eventBusUrl').val();
  var eventBus = null;

  return new RSVP.Promise(function(resolve, reject) {
    if(!eventBus) {
      eventBus = new vertx.EventBus(eventBusUrl);

      eventBus.onopen = function eventBusOpened() {
        console.log('Event bus online');
        resolve(eventBus);
      }

      eventBus.onclose = function() {
        eventBus = null;
      };
    }
  });
}());

然后在其他脚本中我用这种方式调用它:

Events.then(function(eventBus) {
  console.log("registering handlers for comments");
  eventBus.registerHandler(address, function(incomingMessage) {
    console.log(incomingMessage);
  });
});

我希望这可以帮到你。

问候。