Meteor - 为什么我应该尽可能使用this.userId而不是Meteor.userId()?

时间:2015-09-26 17:55:46

标签: javascript mongodb meteor meteor-accounts ddp

来自David Glasser的this comment在GitHub问题中的评论:

  

this.userId是主要的API,Meteor.userId()是新手JavaScript用户的语法糖,可能无法理解成功使用此功能的详细信息

似乎我们应该尽可能使用this.userId(例如在方法函数中,您可以同时使用它们),并且只在发布函数中使用Meteor.userId()。如果这个假设是正确的, 为什么

(参考代码的相关位也会有所帮助,我似乎无法找到它)

2 个答案:

答案 0 :(得分:13)

您的问题似乎与Meteor.userId()Meteor.user()混为一谈。问题的主体似乎在询问前者,而主题是询问后者。我会尝试解决这两个问题。

  1. 在服务器上,在发布功能中,调用Meteor.userId()Meteor.user()cause an error。相反,分别使用this.userIdMeteor.users.findOne(this.userId)。但请注意,只有在客户端订阅时才会调用publish函数。如果您希望在用户记录更改时更改发布,则需要observe() Meteor.users.find(this.userId)返回的光标,并在记录更改时采取适当的操作。
  2. 在服务器上,在处理方法调用时,Meteor.userId()Meteor.user()将分别对应于主叫用户的ID及其记录。但请注意,调用Meteor.user()会导致数据库查询,因为它们是essentially equivalent to Meteor.users.findOne(Meteor.userId())

    直接在方法调用中,您也可以使用this.userId代替Meteor.userId(),但您不太可能看到显着的性能差异。当服务器收到方法调用时,它runs your method implementation with the user's ID (and some other info)存储在光纤上的特定slot中。 Meteor.userId()只是从当前光纤的插槽中检索ID。那应该很快。

    使用Meteor.userId()而不是this.userId重构代码通常更容易,因为您无法在方法正文之外使用this.userId(例如this将不会您从方法体调用的函数中的“userId”属性,并且您无法在客户端上使用this.userId

  3. 在客户端上,Meteor.userId()Meteor.user()不会抛出错误,this.userId将无效。对Meteor.user()的呼叫是essentially equivalent to Meteor.users.findOne(Meteor.userId()),但由于这对应于迷你mongo数据库查询,因此性能可能不会成为问题。但是,出于安全原因,Meteor.user()返回的对象可能不完整(特别是如果未安装autopublish包)。

答案 1 :(得分:1)

简单来说,Meteor.userId()每次使用时都会查询数据库。在客户端(逻辑上),它看起来很好 - 因为我们有minimongo。

在服务器端,使用Meteor.userId()会占用SERVER上的额外资源,而这些资源有时是不受欢迎的。

现在,this.userId更像是一个会话变量m,即只有在当前会话附加了用户标识时才会有值。因此,使用'this'引用不会每次都获取数据库,而是使用活动会话userId。

将表现视为一个因素。这是使用this.userId而不是Meteor.userId

的主要原因