2016-04-17 4 views
0

私はそれがここMeteor/MongoDBでデータを操作するとき、私は何が間違っていますか?

をuser.role返すようにしたい、このヘルパーに

myClub: function(){ 
    var currentUserId = Meteor.userId(); 
    var user = Meteor.users.findOne({_id: currentUserId}); 
    return user; 
} 

を持っては、上記のコードは問題なく動作するMongoDB

{ 
    "_id" : "RdirmrLG3t8qBk4js", 
    "createdAt" : ISODate("2016-04-17T19:40:56.877Z"), 
    "services" : { 
     "password" : { 
      "bcrypt" : "$2a$10$cPe92XR9DT238bH/RanYEu.J6K2ImvAEbWOcVq6j9luI0BH08Qdly" 
     }, 
     "resume" : { 
      "loginTokens" : [ 
       { 
        "when" : ISODate("2016-04-17T19:51:49.474Z"), 
        "hashedToken" : "uVKUj/7JEkkOuizXhjl212Z38E47HXCex+D4zRikQ1k=" 
       } 
      ] 
     } 
    }, 
    "username" : "worker", 
    "role" : "worker", 
    "club" : "hzSKAJfPXo7hSpTYS" 
} 

の私のユーザーです。したがって、現在のユーザーを見つけ出し、そのユーザーに関する情報を出力します。しかし、user.roleにユーザーを変更すると、次のようなエラーメッセージが表示されます。

TypeError: Cannot read property 'role' of undefined at Object.myClub

どのように定義できますか?私の構文は間違っていますか?

+0

私は出力に管理するか、今ではなく、役割をユーザーのTORユーザー名を確認することができます。しかし、それは構造と何か関係がありますか?私が走るとき Meteor.users.find()。fetch();コンソールで 私はこの >オブジェクト IDを取得:「RdirmrLG3t8qBk4js」 ユーザ名:「労働者」 > __ __プロト:オブジェクト をだから、ユーザ名はuser.usernameで取得することができることを論理的に見えます。しかし、その役割は同じレベルではありません。私は構造内で役割を見つけることさえできません。なぜ、どこでそれを見つけるのですか? –

答えて

0

試してみてください。

myClub: function(){ 
    return Meteor.user() && Meteor.user().role; 
} 

これは、ユーザーがあるかどう役割を返すの省略形です。

roleフィールドが表示されていない限り、の公開鍵をサーバーから取得し、購読していることを確認してください。たとえば:

Meteor.publish('me',function(){ 
    return Meteor.users.find(this.userId,{fields: {role: 1, username: 1, profile: 1, emails: 1}}); 
}); 

とクライアント上:

var me = Meteor.subscribe('me'); 
if (me.ready()) console.log("Ta-da! The role is: "+Meteor.user().role); 
+0

(ユーザーはいますか)=(ユーザーはログインしていますか?) このコードでは何も返されないので、ユーザーがいないと思います。しかし、私はユーザーと一緒にログインしており、それには役割があります。 –

+0

ユーザオブジェクトはロードするのに数ミリ秒かかります。ログインすることができ、ユーザオブジェクトを持たなくても 'userId'を持つことができます。 –

+0

しかし、私はまだuserdocumentのロールフィールドを見つけるのに問題があります。私は少し前に私の質問を更新しました。 –

1

テンプレートヘルパーは反応的です。つまり、アプリ状態の変更や新しいデータが表示されたときに自動的に更新されます。あなたのケースでは、テンプレートがレンダリングされ、Meteor.usersコレクションがいっぱいになる前にヘルパーが直ちに呼び出されます。したがって、.findOne()メソッドは未定義を返します。新しいデータが到着した後、2番目のパスで修正されます。

ここで簡単な修正は、データがヘルパー内部に存在するかどうかをチェックすることです:

myClub: function(){ 
    var currenUserId = Meteor.userId(); 
    var user = Meteor.users.findOne({_id: currenUserId}); 
    if(!user) return 'NO DATA'; 
    return user.role; 
}, 

は、現実の生活の中であなたはおそらく、あなたがテンプレートをレンダリングする前に、基本的なデータがロードされるのを待つことになるでしょう。これは通常コントローラレベルで行われます。

+0

私は考えを得る。今はエラーは出ませんが、何も出力しません。 –

0

あなたが必要なすべてのデータをサブスクライブしていることを確認します。

ところで、あなたは次のよう試すことができます。

role: function(){ return (Meteor.user() || {}).role; } 

乾杯

+0

ありがとう!サブスクリプションの疑いがあります。しかし、私はまだこのプロジェクトで自動公開しています。サブスクリプションは本当にissuですか? –

+0

プロジェクトに自動公開パッケージを残しておけば、サブスクリプションに問題はないはずです。 –

関連する問題