【问题标题】:How long do certain Meteor data sources live for?某些 Meteor 数据源的寿命有多长?
【发布时间】:2014-10-27 04:41:52
【问题描述】:

MiniMongo Collection 通常会与 Mongo Collection 同步,因此它的生命基本上是永远的。

我想存储一个Shopping Cart 对象。当用户登录时,存储和管理购物车数据的持续时间很容易。但是当用户没有登录时呢?您不希望他们导航到网站的其他部分,甚至不希望刷新页面并彻底清除他们的购物车。但您也不想将购物车存放太久。将内容存储一天或几个小时就足够了。

miniMongo 本地集合 (new Mongo.Collection("null");) 能持续多久?我可以将购物车内容存储在本地集合中,还是在页面刷新时该集合会被擦除?

同样,一个 Session 变量能持续多久?

--- 答案总结---

  • 会话变量 - 页面刷新后死亡,反应性
  • 本地集合 - 页面刷新后死亡,反应性
  • Lo​​calStorage API - https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage,持续不同的时间段,从永远持续到关闭选项卡时,不是响应式的,不同的浏览器有不同的方式从 LocalStorage 存储和检索,因此代码复杂。
  • Lo​​calStorage 使用 Amplify - http://amplifyjs.com/ - 基本上是使用 LocalStorage API 的一种更简单的方法。
  • 将数据存储到带有时间戳的 Mongo 集合中。使用该时间戳运行一个 cronjob,该 cronjob 在一定时间后定期删除数据 - 反应式,在所有计算机和浏览器中持续存在,让您完全控制数据过期的方式和时间,需要更多的编码和设置

【问题讨论】:

  • 也许代码应该在创建数据库对象时存储时间戳和过期日期。此外,会话变量存储在 HTML5 本地存储中。因此,它们与浏览器相关联,因此您不能依赖它来存储必须从其他浏览器(即移动与固定、家庭与办公室等)获得的信息。
  • @Paul,HTML5 本地存储 - 很有趣。看起来有两种类型: HTML本地存储提供了两个对象用于在客户端存储数据:window.localStorage - 存储没有过期日期代码的数据.sessionStorage - 存储一个会话的数据(关闭选项卡时数据丢失)我想知道 Session 使用什么类型?本地收藏呢?它们也在 HTML5 本地存储中吗?
  • "HTML5 sessionStorage 对象等同于 localStorage 对象,只是它只存储一个会话的数据。当用户关闭浏览器窗口时,数据被删除。"基于此,我猜测 Meteor Session 变量存储为 HTML5 SessionStorage 对象,只要用户打开选项卡,它就会一直存在?
  • 现在我不太确定。我去了meteorpad.com,弹出了一个chrome调试窗口并做了Session.set('name','Me'),这是Meteor应用程序所采用的。在 localStorage 和 sessionStorage 中查找,'name' 是找不到的。

标签: meteor


【解决方案1】:

页面刷新后会话变量和本地集合将被删除,因此您可以将它们从您的可能性列表中删除。

另一种方法是将购物车数据存储在localStorage 中。您可以通过直接调用 localStorage API 来实现,如果您需要支持旧版浏览器,也可以使用像 amplify.js (meteor package) 这样的 polyfill。这种方法的唯一问题是它不能跨浏览器/计算机工作,并且不会在选项卡之间产生反应。

我的建议是将购物车数据存储在维护updatedAt 时间戳的集合中。然后添加一个cron job,它会定期删除所有updatedAt 超过X 小时的购物车。这具有跨标签/浏览器/计算机进行响应式工作的优势,并且您可以完全控制购物车何时过期(包括添加花哨的规则,例如如果用户碰巧连接了购物车,则不会过期)。

【讨论】:

  • 我已将我的发现摘要添加到 OP。
  • 如何将保存到数据库的购物车与从未登录过的人联系起来?如果用户在创建购物车时已登录,那么一切都很简单。但是如果用户从来没有登录过,你怎么把这个临时购物车和一个未登录的用户联系起来呢?
  • 我会使用本地存储。当您检测到用户已登录时,只需从本地存储中删除数据并将其插入到集合中。它不是那么好,但在没有唯一用户标识符的情况下,它可能是你能做的最好的。
  • @fuzzybabybunny 你可能想看看natestrauser:cart是如何做到的。
【解决方案2】:

GroundDB 旨在在 Collections API 之上创建一个精简的包装器,这样您就可以在本地保持连接而无需太多编码开销,即使是离线访问也是如此。当您重新连接数据时会刷新。 https://github.com/GroundMeteor/db

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多