5

从David Glasser 在 GitHub 问题中的评论来看:

this.userId是主要的 API,Meteor.userId()对于刚接触 JavaScript 的用户来说是语法糖,他们可能还不了解成功使用它的细节

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

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

4

2 回答 2

15

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

  1. 在服务器上,在发布函数中,调用其中一个Meteor.userId()Meteor.user()导致错误。相反,请分别使用this.userIdor Meteor.users.findOne(this.userId)。但是,请注意,仅在客户端订阅时才调用发布函数。如果您希望在用户记录更改时发布更改,则需要在记录更改时observe()返回光标Meteor.users.find(this.userId)并采取适当的操作。
  2. 在服务器上,在处理方法调用时,Meteor.userId()Meteor.user()分别对应调用用户的 ID 和他们的记录。但是,请注意,调用Meteor.user()将导致数据库查询,因为它们本质上等同于Meteor.users.findOne(Meteor.userId()).

    直接在方法调用中,您也可以使用this.userId代替Meteor.userId(),但您不太可能看到显着的性能差异。当服务器接收到方法调用时,它会使用存储在光纤上特定插槽中的用户 ID(和其他一些信息)来运行您的方法实现。只需从当前光纤上的插槽中检索 ID。那应该很快。Meteor.userId()

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

  3. 在客户端上,Meteor.userId()不会Meteor.user()抛出错误,this.userId也不会工作。调用本质Meteor.user()等同于Meteor.users.findOne(Meteor.userId()),但由于这对应于 mini-mongo DB 查询,因此性能可能不会成为问题。但是,出于安全原因,返回的对象Meteor.user()可能不完整(尤其是在autopublish未安装软件包的情况下)。
于 2015-09-27T06:44:38.953 回答
1

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

在服务器端,使用 Meteor.userId() 会消耗 SERVER 上的额外资源,这有时是不希望的。

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

将性能视为一个因素。这是使用 this.userId 而不是 Meteor.userId 的主要原因

于 2015-09-26T18:08:02.370 回答