来自David Glasser的this comment在GitHub问题中的评论:
this.userId
是主要的API,Meteor.userId()
是新手JavaScript用户的语法糖,可能无法理解成功使用此功能的详细信息
似乎我们应该尽可能使用this.userId
(例如在方法函数中,您可以同时使用它们),并且只在发布函数中使用Meteor.userId()
。如果这个假设是正确的, 为什么 ?
(参考代码的相关位也会有所帮助,我似乎无法找到它)
答案 0 :(得分:13)
您的问题似乎与Meteor.userId()
和Meteor.user()
混为一谈。问题的主体似乎在询问前者,而主题是询问后者。我会尝试解决这两个问题。
Meteor.userId()
或Meteor.user()
将cause an error。相反,分别使用this.userId
或Meteor.users.findOne(this.userId)
。但请注意,只有在客户端订阅时才会调用publish函数。如果您希望在用户记录更改时更改发布,则需要observe()
Meteor.users.find(this.userId)
返回的光标,并在记录更改时采取适当的操作。在服务器上,在处理方法调用时,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
。
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
的主要原因