【问题标题】:Meteor Session Replacement?流星会话替换?
【发布时间】:2013-03-13 22:20:14
【问题描述】:

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

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

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

【问题讨论】:

  • 你是如何使用Session来识别每一个的?普通的 JS 对象不能正常工作/服务器上没有反应,所以它与 Session 相同
  • 普通 Js 对象不起作用,因为对象在会话之间共享!我已经通过在定义对象时登录到控制台对此进行了测试,它总是在服务器启动时出现一次。
  • 你能显示你在之前版本中使用的代码吗?
  • 我大概可以发布它......事情是@cmather,最初的实现是一个facebook应用程序。因此,我没有与 Meteor 中的 Auth api 集成,而是制作了自己的令牌存储和用户跟踪。我使用Session.setSession.get 服务器端作为客户端特定的变量。
  • Session 是一个不幸的命名对象,因为它实际上与我们传统上认为的“会话”无关。要执行您在帖子中提到的内容,我认为更多的用例上下文会有所帮助。我抽象地理解了技术要求,但也许对你正在启用或做的事情有更多的背景会产生更多的选择。

标签: session meteor


【解决方案1】:

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

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

如果您将令牌存储在数据库中,它们将在服务器重新启动后持续存在,并将与 is able to scale an application by adding more server instances when needed 的未来版本的 Meteor 一起使用。

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

【讨论】:

  • 这可能是为什么 Session 被从服务器中删除的最好解释
  • @Akshat 你会推荐这个答案而不是你的答案吗?
  • @supertrue 是和否。是的,如果您使用的是一台服务器。如果您有超过 1 个服务器,则需要使用 Redis 之类的东西。或者,除非您对代理服务器使用诸如粘性会话之类的东西来确保同一用户始终获得同一服务器
【解决方案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.jslivedata_server.js

【讨论】:

  • 难道没有办法扩展流星以默认执行此操作吗?这似乎是一个非常笨重的实现:)
  • 它怎么那么笨重,也许我可以把它熨平?你的意思是需要提供一个sessionid吗?看起来它需要在 livedata 文件中提供,所以 this.sessionData 但在 livedata_server 文件中还没有设置它
  • 我的意思是每次你打电话时都会传递那个id。此外,您将如何使用这样的方式进行响应式订阅?允许规则吗?
  • 响应式订阅可以通过在设置器中运行某些东西来完成,就像响应式在客户端上的工作方式一样。 id 是需要在 livedata 服务器文件中排序的东西,如果现在使用它基本上需要一个自定义的流星,所以这就是让它在发布功能/允许/拒绝规则中使用的原因。你也在这些中使用它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2015-08-20
  • 1970-01-01
  • 2011-08-16
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多