すべてのユーザーの特定のフィールドセットにクライアント側でアクセスしたいのですが、現在のユーザーだけにさらに多くのフィールドにアクセスしたいのです。これを実現するために公開コードを作成するにはどうすればよいですか?
3 に答える
Meteorのドキュメントから直接:
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}});
});
お役に立てれば。
上記のように、
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()
オブジェクトで利用できるようになります。
それに関する私の話:私はドキュメントが言うように進みましたが、奇妙な振る舞いに遭遇しました。公開機能があり、現在のユーザー(たとえば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
fromパラメーターに置き換えるだけです。
私が遭遇した次のバグは、プロファイルユーザーのオブジェクトに秘密の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コールバックがユーザーアカウントドキュメントでカスタムオブジェクトを提供しないを参照してください
PS:最初にそれを知っていたなら、私はsystemDataオブジェクトを特別なコレクションに入れました。