Meteor Session 和浏览器刷新

Posted

技术标签:

【中文标题】Meteor Session 和浏览器刷新【英文标题】:Meteor Session and browser refreshes 【发布时间】:2012-11-02 12:09:20 【问题描述】:

刷新页面时 Meteor 会话是否会重置?

出于某种原因,我认为他们没有,但似乎他们确实做到了。有没有办法让他们坚持下去?

如果不是,最好的解决方案是什么?

我想让相同的数据显示用户是否刷新(此数据特定于用户),即使他们尚未注册。

【问题讨论】:

我在 Meteor.user 中保存了一些常用数据,当页面刷新时你可以重新设置。 是的,只是我希望即使他们没有登录也能持久化。 【参考方案1】:

实际上,您可以做的是创建一个 Session 的“子类”,在调用 set() 时将值存储在 Amplify 的存储中。您将自动继承 Session 的所有反应属性。这是代码,它对我有用:

SessionAmplify = _.extend(, Session, 
  keys: _.object(_.map(amplify.store(), function(value, key) 
    return [key, JSON.stringify(value)]
  )),
  set: function (key, value) 
    Session.set.apply(this, arguments);
    amplify.store(key, value);
  ,
);

只需将所有 Session.set/get 调用替换为 SessionAmplify.set/get 调用即可。调用 set() 时,会调用父 Session 方法,以及 amplify.store()。首次创建“子类”时,它会将 amplify 存储中的所有内容加载到其键中,以便可以立即使用 get() 检索它们。

您可以在此处测试排行榜示例的工作变体:https://github.com/sebastienbarre/meteor-leaderboard

【讨论】:

如果我只想用 amplifyjs 持久化一个键,特别是 Session 的一个键,否则让所有其他键像往常一样运行,我怎么能使用这种技术?有没有办法调整你的方法? 不确定 sebastien.b 是否为同一作者,但确切地说,此代码可作为一个包使用,通过使用 mrt add session-amplify 安装。 github项目在这里:github.com/cramrov/meteor-session-amplify【参考方案2】:

这是一个老问题,但它是搜索“流星会话管理器”的第二次点击,所以我认为补充一点很重要,包 u2622:persistent-session 完美地解决了这个问题。

来自以下文档: https://atmospherejs.com/u2622/persistent-session

安装

流星添加 u2622:persistent-session

就是这样!现在您可以使用 Session.setPersistent 设置会话 刷新后保存的变量。

如果您愿意,也可以让 Session.set 执行此操作。见 下面的选项部分。

【讨论】:

感谢这个。它对我有用。我唯一需要在我的代码中更改的是:将 Session.set(.. 更改为 Session.setAuth( ; 和 Session.clearAuth(.. on logout. 这里可能有用的是要注意,在持久会话的引擎盖下,它的放大只是有效!【参考方案3】:

我刚刚为 Atmosphere 创建了UserSession 包,它基本上是一个基于用户的持久化Session

【讨论】:

为清楚起见,此包将会话变量保存在服务器端集合中。如果您正在寻找会话变量的客户端存储,根据 sebastien.b 的回答,这可以通过 amplify 很好地实现。 好包,但它依赖于 userId,这意味着我们需要一个登录用户。 :(【参考方案4】:

所以我认为最好的方法是使用 amplifyJS 包。

这是一些人的要点,显示了他们如何使用它: https://gist.github.com/2865146

【讨论】:

【参考方案5】:

Session 是一个全局键值存储,一个反应式存储。

http://docs.meteor.com/#session

Session 在客户端提供了一个全局对象,您可以使用它来存储任意一组键值对。使用它来存储列表中当前选定的项目等内容。

Session 的特别之处在于它是反应式的。如果您从模板内部调用 Session.get("currentList"),则每当调用 Session.set("currentList", x) 时,都会自动重新渲染模板。

如果您必须在客户端中保留某些内容,您可以使用浏览器 localstorage 或者如果您喜欢旧版浏览器,则可以使用 cookie。

【讨论】:

这实际上是 Amplify 包所做的,除了各种后备支持。

以上是关于Meteor Session 和浏览器刷新的主要内容,如果未能解决你的问题,请参考以下文章

Node.js刷新session过期时间

如何在开发中禁用 Meteor JS 中的热代码推送?

session的使用

vue项目刷新页面导致数据消失问题解决

如何在浏览器和移动模拟器之间获取 Meteor 实时更新?

为啥刷新一下页面SessionID会变