如何确定请求源自哪个客户端?

时间:2016-01-30 22:04:17

标签: meteor

我正在构建一个控件,其中存在视觉反馈,因为服务器会响应来自客户端的输入。

控件将同时在多个客户端上可见,我希望对控件进行更改的客户端对所有其他客户端的反馈略有不同,这些反馈会看到有关状态更改的信息较少。

是否有流星内置功能来唯一标识我可以用于此的每个客户端?如果没有,我怎么能去做一个不可否认的标识符呢?它需要在同一浏览器中识别两个不同的客户端中的两个不同选项卡。

1 个答案:

答案 0 :(得分:1)

我无法找到任何简单的方法来构建Meteor,但您可以根据具体用例进行尝试。

这是一种跟踪每个浏览器窗口或选项卡的唯一客户端连接的技术。下面的每个connectionId都可以被认为是聊天室。由于Meteor方法中的this.connection.id属性在每个打开的窗口或选项卡中不是唯一的,因此这将在集合中存储连接ID以及时间戳。当客户端关闭浏览器选项卡或窗口时,您可以使用服务器方法this.connection.onClose内的回调来通过其ID和时间戳查找该特定连接,并将其标记为关闭或脱机。

Fiber = Npm.require('fibers');
Future = Npm.require('fibers/future');

Meteor.methods({

  'client.disconnect': function(connectionId){
    check(connectionId, String);
    let query = {_id: connectionId};
    let options = {$set: {isOnline: false}};
    return Connections.update(query, options);
  },

  'client.connect': function(connectionId){
    check(connectionId, String);
    let lastSessionTime = Number(new Date().getTime());
    let lastSessionId = this.connection.id;
    let offlineQuery = {
      _id: connectionId,
      lastSessionTime: lastSessionTime,
      lastSessionId: lastSessionId
    }
    let offlineOptions = {
      $set: {isOnline: false}
    }

    // When the connection closes, turn this connection offline.
    this.connection.onClose(function(){
      // You could also remove the document.
      Connections.update(offlineQuery, offlineOptions);
    });

    let onlineQuery = {
      _id: connectionId
    }
    let onlineOptions = {
      $set: {
        lastSessionTime: lastSessionTime,
        lastSessionId: lastSessionId,
        isOnline: true}
    }

    var future = new Future();
    Connections.upsert(onlineQuery, onlineOptions, function(err, res){
      if (err){
        future.throw('Connections.online error');
      }else{
        future.return(res);
      }
    });
  }
});