0

開発中のアプリのユーザー プロファイル ページを作成しました。ユーザーがログインしているときはページが正常に機能しますが、誰もログインしていないときはテンプレートが空です。私の目標は、誰でも (アプリに登録していなくても) ユーザー プロファイルを表示できるようにすることです。

コードは次のとおりです。

出版物:

Meteor.publish('singleUser', function(userId) {
    if (this.userId) {
        var findById = Meteor.users.find(userId);
        return findById.count() ? findById : 'undefined';
    }
    return [];
 });

ルーター:

this.route('user_profile', {
    path: '/users/:_id',
    waitOn: function() {
        return Meteor.subscribe('singleUser', this.params._id);
    },
    data: function() { 
        return Meteor.users.findOne({_id: this.params._id}); 
    }
});

プロファイル テンプレート:

<template name="user_profile">
    <h4>Username</h4>
    <p>{{username}}</p>
    <h4>User since:</h4>
    <p>{{createdAtFormatted}}</p>                   
</template> 

プロファイル ヘルパー:

Template.user_profile.helpers({
    createdAtFormatted: function(){
        return  moment(this.createdAt).fromNow();
    }   
});

コードに何が欠けているのかわかりません。

ありがとう!

4

2 に答える 2

3

あなたはほとんどそれを手に入れました - パブリッシュ機能を修正する必要があるだけです. プロファイル ページに移動したときに必要なユーザーのみを公開するというアプローチは正しいです。

発行関数の内部ではthis.userId、呼び出し元のユーザーの ID を参照します。userIdログインしていない[]クライアントには . パブリッシュ関数の残りの部分は不要です。カーソルを返す必要があり、データが見つからない可能性をすべて処理する必要はありません。私はあなたがこのようなものが欲しいと思います:

Meteor.publish('userForProfilePage', function(userId) {
  check(userId, String);
  return Meteor.users.find(userId, {
    fields: {createdAt: 1, username: 1}
  });
});

次の点に注意してください。

  • 関数に明示的な名前を使用して、何をしているのかを明確に識別しました。userForProfilePageよりクリアだと思いますsingleUserが、これは好みの問題です。必要に応じて購読を変更してください。
  • 入力の簡単なチェックを使用しましたuserId。これは、それが文字列であり、未定義ではないことを検証します。必要に応じて、より高度なチェックを追加できます。
  • チェックに合格した場合にのみ、 のカーソルを返しますuserId_idカーソルによって返されるドキュメントには、、、createdAtおよびフィールドのみが含まれusernameます (これはセキュリティのために行われます)。
于 2013-12-23T00:28:45.693 に答える
1

すべてのユーザーのプロファイルを表示するか、1 人のユーザーのプロファイルのみを表示するかはよくわかりません。ログアウトすると、システムは現在どのユーザーと話しているかがわからないためです。「ユーザープロファイルを見たい」と言ったので、これを推測します。

これを試して:

Meteor.publish('allUsers', function() {
    return Meteor.users.find();
});

を使用することもできますMeteor.methods()

Meteor.methods({
    allUsers: function () {
        return Meteor.users.find();
    }
});

{{#each allUsers}}{{/each}}テンプレートをブロックにラップすることを忘れないでください。

編集: セキュリティの問題に関しては、値をクライアントに渡す前にマップしてください。

Meteor.methods({
    allUsers: function () {
        return Meteor.users.find().fetch().map(function(user) {
            return {
                "name": user.username,
                "createdAt": user.createdAt
            };
        });
    }
});
于 2013-12-22T22:45:32.210 に答える