2016-04-17 32 views
0

我有這樣的幫手在Meteor/MongoDB中操作數據時,我做錯了什麼?

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

我想它返回user.role

這是我在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()方法返回未定義。新數據到達後,將在第二階段更正。

簡單的修復這裏是檢查數據是否存在輔助內部:

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

如果您在項目中保留自動發佈軟件包,則訂閱應該不會有任何問題。 –