web-dev-qa-db-ja.com

Meteor.usersの特定の情報とMeteor.userの詳細情報を公開する

すべてのユーザーの特定のフィールドセットにクライアント側でアクセスしたいのに対し、現在のユーザーのみにさらに多くのフィールドにアクセスしたいです。これを達成するために公開コードを書くにはどうすればよいですか?

34
HGandhi

流星のドキュメント から:

Meteor.publish("userData", function () {
    return Meteor.users.find({_id: this.userId},
        {fields: {'other': 1, 'things': 1}});
});

そしてまた:

Meteor.publish("allUserData", function () {
    return Meteor.users.find({}, {fields: {'nested.things': 1}});
});

お役に立てれば。

47
jtblin

上記のように、

_Meteor.publish("userData", function () {
    return Meteor.users.find({_id: this.userId},
        {fields: {'other': 1, 'things': 1}});
});
_

そして

_Meteor.publish("allUserData", function () {
  return Meteor.users.find({}, {fields: {'nested.things': 1}});
});
_

発行関数は、Usersコレクションからデータをプッシュします。

で購読する

_Tracker.autorun(function () {
    Meteor.subscribe("userData");
    Meteor.subscribe("allUserData");
});
_

また、追加データは自動的にUsersコレクションに入れられ、Meteor.user()オブジェクトで利用可能になります。

32
Jesse Smith

それに関する私の話:私はドキュメントが言うように進みましたが、奇妙な行動に遭遇しました。現在のユーザー(userDataと言う)のプロファイルとメールオブジェクト全体を公開し、他のユーザー(allUserData)の一部のサブセットのみを公開する公開機能がありました。

私がいたとき-

_Meteor.subscribe("allUserData");
Meteor.subscribe("userData");
_

ユーザーがログインした直後のクライアント側で、allUserDataデータのみを受信しました。つまり、ログインしているユーザーであっても(そのユーザーは自分のメールアドレスを見ることができませんでした)。 ブラウザを更新すると、バグが修正され、適切なallUserData(言及された電子メールアドレスを持つ)がログインしている1人を除くすべてのユーザーに対してuserDataが適切に取得されました。

興味深いことに、そのサブスクリプションのシーケンスを変更すると、バグが修正されました。

_Meteor.subscribe("userData");    
Meteor.subscribe("allUserData");
_

Meteor.autosubscribe(function () { })に入れても何も変わりません。最後に、そのサブスクリプションをDeps.autorun(function() { })に入れて、反応性を明示的に追加し、シーケンスの問題を解決しようとしました。

_Deps.autorun(function() {
  Meteor.subscribe("allUserData", Meteor.userId());
  Meteor.subscribe("userData", Meteor.userId());
  // or
  // Meteor.subscribe("userData", Meteor.userId());
  // Meteor.subscribe("allUserData", Meteor.userId());
}); 
_

パブリッシュ関数では、_this.userId_をパラメータのuserIdに置き換えるだけです。

私が遭遇した次のバグは、プロファイルユーザーのオブジェクトに秘密のsystemDataオブジェクトがあり、通常のログインユーザーではなく、管理者だけを見ることができるということでした。ただし、_'profile.systemData': 0_を使用して関数を正しく設定すると、そのシークレットオブジェクトは、プロファイルオブジェクトを調べたすべてのログインユーザーを見ることができます。おそらく、私の公開機能が何らかの形でMeteorアカウントパッケージの公開機能に干渉したためでした。

_// Publish the current user's record to the client.
Meteor.publish(null, function() {
 if (this.userId) {
   return Meteor.users.find(
     {_id: this.userId},
     {fields: {profile: 1, username: 1, emails: 1}});
 } else {
   return null;
 }
}, /*suppress autopublish warning*/{is_auto: true});
_

とにかく、メソッドAccount.onCreateUser()を使用して解決し、systemDataをプロファイルではなくプロファイルオブジェクトの隣に追加しました。私の他の問題が始まります:)参照してください Meteor.loginWithPasswordコールバックはユーザーアカウントdocでカスタムオブジェクトを提供しません

PS:最初にそれを知っていたら、systemDataオブジェクトを特別なコレクションに入れました。

4
jindrichb