5

GitHub の問題の David Glasser によるこのコメントから判断すると、次のようになります。

this.userId主要な API であり、Meteor.userId()これをうまく使用するための詳細をまだ理解していない可能性のある、JavaScript を初めて使用するユーザー向けのシンタックス シュガーです。

this.userId可能な限り(両方を使用できるメソッド関数内など)使用し、Meteor.userId()パブリッシュ関数内でのみ使用する必要があるようです。この仮定が正しければ、なぜですか?

(コードの関連ビットを参照することも役に立ちますが、見つけられないようです)

4

2 に答える 2

15

あなたの質問は と を混同Meteor.userId()しているようMeteor.user()です。質問の本文は前者について尋ねているようですが、件名は後者について尋ねています。私は両方に対処しようとします。

  1. サーバーでは、公開関数内で または のいずれMeteor.userId()かを呼び出すと、エラーMeteor.user()発生します。代わりに、this.userIdまたはMeteor.users.findOne(this.userId)をそれぞれ使用します。ただし、パブリッシュ関数は、クライアントがサブスクライブするときにのみ呼び出されることに注意してください。ユーザー レコードが変更されたときにパブリケーションを変更する場合は、observe()によって返されたカーソルを使用Meteor.users.find(this.userId)して、レコードが変更されたときに適切なアクションを実行する必要があります。
  2. サーバー上では、メソッド呼び出しが処理されている間、呼び出し元のユーザーの IDMeteor.userId()Meteor.user()そのレコードにそれぞれ対応します。ただし、 への呼び出しは基本的に と同等でMeteor.user()あるため、DB クエリになることに注意してください。Meteor.users.findOne(Meteor.userId())

    メソッド呼び出し内で直接、 のthis.userId代わりに を使用することもできMeteor.userId()ますが、パフォーマンスに大きな違いが見られることはほとんどありません。サーバーがメソッド呼び出しを受信すると、ファイバー上の特定のスロットに格納されているユーザー ID (およびその他の情報) を使用してメソッドの実装を実行します。現在のファイバーのスロットから ID を取得するだけです。それは速いはずです。Meteor.userId()

    通常、メソッド本体の外部で使用することはできず(たとえば、メソッド本体から呼び出す関数内に「userId」プロパティを持たない) 、クライアントで使用できMeteor.userId()ないため、使用するコードをリファクタリングする方が簡単です。 .this.userIdthis.userIdthisthis.userId

  3. クライアントでは、エラーがスローされず、機能Meteor.userId()しません。への呼び出しは基本的に と同等ですが、これはミニ mongo DB クエリに対応するため、パフォーマンスはおそらく問題になりません。ただし、セキュリティ上の理由から、によって返されるオブジェクトは不完全な場合があります (特にパッケージがインストールされていない場合)。Meteor.user()this.userIdMeteor.user()Meteor.users.findOne(Meteor.userId())Meteor.user()autopublish
于 2015-09-27T06:44:38.953 に答える