流星会话更换?

时间:2013-03-13 22:20:15

标签: session meteor

在最新的Meteor版本(版本0.5.8)中,Session已从服务器端代码中删除。

以前我使用Session为服务器存储客户端特定的变量; 此功能的替代品是什么?

示例案例:User One打开浏览器,User Two打开浏览器。一个调用服务器上的方法设置一些令牌,另一个调用服务器上的方法执行相同的操作。然后我需要在客户端请求时访问它。 如何区分这两者?

2 个答案:

答案 0 :(得分:7)

您需要将令牌保存到数据库中的集合中。

如果您只想将Session包复制到应用程序的session目录中并将其package.js更改为也加载到服务器上,则可以在服务器上使用packages 。但是Session是内存中的数据结构,因此如果你有多个服务器实例,它将不起作用;如果不丢失用户的令牌,您将无法重新启动服务器。

如果您将令牌存储在数据库中,它们将在服务器重新启动时保持不变,并且可以使用未来版本的Meteor is able to scale an application by adding more server instances when needed

如果您需要使您的令牌过期(以便您的收藏不会无限制地增长),您可以将“lastUsed”日期字段添加到您的令牌集合中,并定期删除未使用超过时间的令牌你选择的有效期。

答案 1 :(得分:2)

您也可以使用每个会话ID,该会话ID也是该选项卡唯一的。不太确定如何获取当前会话ID但它应该在某处(您可以在Meteor.default_server.sessions中看到它,所以仍有一种方法:

客户端js

Meteor.call("test", Meteor.default_connection._lastSessionId, function(err,result) {
    console.log(result);
});

服务器端Js

Session = {
  set : function(key, value, sessionid) { 
      console.log(Meteor.default_server.sessions[sessionid]);
      if(!Meteor.default_server.sessions[sessionid].session_hash) Meteor.default_server.sessions[sessionid].session_hash = {};
      Meteor.default_server.sessions[sessionid].session_hash.key = value;
  },
  get : function(key, sessionid) {
      if(Meteor.default_server.sessions[sessionid].session_hash)
        return Meteor.default_server.sessions[sessionid].session_hash.key;
  },
  equals: function(key, value, sessionid) {
      return (this.get(key, sessionid) == value)
  },
  listAllSessionids: function() {
      return _.pluck(Meteor.default_server.sessions, "id");
  }  
};


Meteor.methods({
    test:function(sessionid) {

        if(!Session.get("initial_load", sessionid)) Session.set("initial_load", new Date().getTime(), sessionid);

        return Session.get("initial_load", sessionid);
    }
});

我挂钩Meteor.default_connection._sessions来存储值,以便在会话无效时(即用户已关闭其选项卡)涉及某种类型的垃圾收集,以防止浪费内存。在livedata_server.js中,这些旧会话在DDP线上没有活动1分钟后被破坏(如心跳)。

由于服务器可以看到每个人的会话,因此您可以使用sessionid访问其他用户的会话数据。并listAllSessionids给出当前活动的所有会话数组。

在方法中自动设置类似this.userId的会话而不在调用中使用参数

看起来有这个功能,但它并没有完全连接起来。会话ID将存储在this.sessionData中,但可能仍未完成。它可以在method中调用,但它无处设置(livedata_connection.js& livedata_server.js