9

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

以前我曾经为服务器Session存储特定于客户端的变量;这个功能的替代品是什么?

示例案例:User One打开浏览器,User Two打开浏览器。一个调用服务器上的方法设置一些令牌,另一个调用服务器上的方法做同样的事情。然后,当客户端请求某些内容时,我需要访问它。我如何区分两者?

4

2 回答 2

7

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

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

如果您将令牌存储在数据库中,它们将在服务器重新启动时保持不变,并将与未来版本的 Meteor 一起使用,该版本能够通过在需要时添加更多服务器实例来扩展应用程序

如果您需要使令牌过期(这样您的集合就不会无限制地增长),您可以在令牌集合中添加一个“lastUsed”日期字段,并定期删除未使用超过您选择的到期时间的令牌时期。

于 2013-04-10T20:31:27.547 回答
2

您也可以使用每个选项卡独有的会话 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给出当前活动的所有 sessionid 的数组。

在方法中自动设置像 this.userId 这样的会话,而不在调用中使用参数

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

于 2013-04-09T08:02:45.213 回答