4

本を読んでMeteorを学んでいますが、現在ログインしているユーザーのことinsert()を知りたいです。userId

Template.categories.events({

    'keyup #add-category': function(e, t) {
        if(e.which == 13) {
          var catVal = String(e.target.value || "");
          if(catVal) {
            lists.insert({Category: catVal, owner: this.userId});
            console.log(this.userId);
            Session.set('adding_category',false);
          }
        }
    },

ただしthis.userId、定義されていないため、insert()期待どおりに機能しませんでした。これを機能させるために何が欠けていますか?

どういうわけか、以下のコードで機能します(userIdが定義されています):

lists.allow({
    insert: function(userId, doc) {
      return adminUser(userId);
    },
    update: function(userId, docs, fields, modifier) {
      return adminUser(userId);
    },
    remove: function(userId, docs) {
      return adminUser(userId);
    }
});

アップデート

サーバー側では機能するのにthis.userId機能しないのはMeteor.userId()なぜですか?

Meteor.publish("Categories", function() {
    return lists.find({owner:this.userId}, {fields:{Category:1}});
});
4

5 に答える 5

8

パブリッシュ関数を除くすべての場所で Meteor.userId() を使用する必要があります。パブリッシュ関数の内部では、this.userId を使用する必要があります。

this.userId はサーバーでのみ使用できます。メソッドでは、レイテンシー補正のためにクライアントがアクセスでき、サーバーが行うことをエミュレートする必要があるため、Meteor.call で this.userId を使用すると、クライアントはそれらを実行すると失敗します。

クライアントは this.userId から userId にアクセスできませんが、クライアントとサーバーの両方 (公開機能を除く) は Meteor.userId() を介して現在の userId にアクセスできます。

これがそれを明確にすることを願っています。これを理解するのにかなりの時間がかかりました。

ところで、これは古い投稿への回答であることは知っていますが、これに対する答えを見つけるのに苦労しました。これが将来同じことを経験する人に役立つことを願っています.

于 2015-02-19T16:14:51.707 に答える
4

Meteor.userId()代わりに使用する必要があります。

于 2013-07-24T00:31:45.713 に答える
3

更新の質問: Meteor.userId はメソッド呼び出しでのみ呼び出すことができます。パブリッシュ関数で this.userId を使用します。

于 2013-12-26T07:45:54.703 に答える
1

私の経験から、this.userIdサーバーのみのメソッド呼び出しパブリッシュ関数で使用して、エラーを回避します。一方、Meteor.userId()クライアントが関与するときはいつでも使用します (パブリッシュ機能以外の場所)。

于 2015-05-02T09:48:54.927 に答える
0

this.userIdサーバー上でのみ使用できます。実行中のMeteorユーザーノードファイバーで、環境属性にアクセスできます。NPM パッケージ (Stripe など) を使用していて、Meteor.bindEnvironment() を使用するコールバックを設定したい場合。ドキュメントはこれについてあまり表現力がありません: http://docs.meteor.com/#/full/timers。この質問も確認してください: Meteor と Fibers/bindEnvironment() で何が起こっていますか?

サーバーでは、コードをファイバー内で実行する必要があります。

クライアントでは、ファイバー内でコードを実行していないため、this.userId利用できません。

于 2015-05-03T08:14:00.713 に答える