如何改进流星的数据处理

How to improve data handling with meteor

仍在使用我的 meteor 应用程序,我现在想了解如何改进 minimongo 的数据处理。

习惯于 SQL / PHP,我想知道如何只从我的 minimongo 集合中查找()一个对象,并使用助手访问它的每个属性,而无需每次都必须重新访问集合。

直到现在,我所做的都是这样的:

Template.profile.helpers({
  name: function(e, tmpl){
    return Meteor.users.FindOne({_id: Meteor.userId()}.profile.name;
  },
  phone: function(e, tmpl){
    return Meteor.users.FindOne({_id: Meteor.userId()}.profile.phone;
  }

[...] });

但它越来越无聊了,我想必须有一种更有效的方法来处理它,我可以只加载我的整个用户信息一次,然后用一个带一个参数的助手显示,以显示这样的数据:{{数据名称}},{{数据phone}}

只有一个这样的帮手:

Template.profile.helpers({
  data: function(aString){
    if (aString == "phone)
      return [...].phone;
    }
  }
[...]
});

当然,我可以使用会话值,但我不确定它是否与我能做的一样相关。

另一件事:如何结束 Meteor 会话?因为使用 PHP,会话在浏览器关闭时结束,并且 cookie 会保留给定的持续时间,但是使用流星会话,我永远不必日复一日地重新连接,我的日志似乎会保留。

有人会指导我解决这个问题或给我一些好习惯/提示吗?我仍在阅读文档,但它非常庞大 :S

谢谢!

我建议在 Atmosphere 上找到 collection 助手包。这将使您能够在模板中编写 currentUser.name,它会自动 return 用户名辅助函数 returns。

这样操作是没有问题的。多次调用该函数并不重要。它不会损害您的应用程序性能。

PHP和流星session不同。只要浏览器 window 保持打开或页面刷新,流星 session 就会持续。你是对的,流星 sessions 不是解决你问题的方法。

这里要注意一件事——当你在客户端上调用 Mongo.Collection.find() 时,你实际上并没有向服务器发送请求——这是由客户端上的 miniMongo 实例处理的,所以它不是真的那么低效。此外,在此特定实例中,当前用户始终可用 Meteor.user()——无需使用 Meteor.users.find({_id: Meteor.userId()});(有关详细信息,请参阅 docs

但是,如果你真的想缓存那个值,你可以这样做:

// JS
var data; // scoped so it's available to the whole file

Template.profile.onCreated({
    data = Meteor.users.findOne({_id: Meteor.userId()}); // above scope makes this new definition available to the whole file
});

然后,要执行您使用字符串参数描述的操作,您可以执行类似...

Template.profile.helpers({
    data: function(aString) { 
      if (data) { return data[aString]; }
    }
});

也许更好的选择甚至是向模板发送数据上下文——在您的 HTML 文件中是这样的:

{{> profile currentUser}} <!-- currentUser returns Meteor.user() -->

您的助手可以直接使用 this:

Template.profile.helpers({
  data: function(aString) { 
    return this[aString];
  }
});

如果您将数据上下文用于路由,您还可以传递数据上下文 through IronRouter

至于 Meteor 会话,模型与 PHP 的模型不同。在 PHP 中,您将会话信息存储在服务器上,每次访问服务器时,浏览器(或客户端,更一般地说)会发送会话 ID,以便它可以查找与您的会话相关的任何内容(请参阅 this question for a potentially better explanation). Meteor keeps track of clients that are connected to it, so the session will stay open as long as your browser is open. If you need to manipulate Meteor user sessions, take a look at this question.