2017-10-17 74 views
1

這裏未定義是HTML:Meteor.userId()返回登錄用戶但Meteor.user()的值在1.5流星

<div> 
    <span id="login-entrance">{{loginEntranceContent}}</span> 
</div> 

這裏是在客戶端側js代碼:

loginEntranceContent(){ 
    if (Meteor.userId()==null) { 
     return 'Log in/Sign up'; 
    } else { 
      Meteor.user().emails.address; 
    }; 
}, 

現在我確定用戶已登錄,因爲當我嘗試使用Meteor.userId()時,它將返回當前用戶的_id值。但是Meteor.user()原來是未定義的。我認爲Meteor.user()結果應該稍後自動更新。所以我等了一會兒,但它並沒有在我的Chrome瀏覽器中更新。

而且我知道這個問題與在數據準備好之前DOM呈現的事實有關。但我不知道那裏到底發生了什麼。

我已經圍繞論壇尋找答案,有一些類似的話題,但沒有人提供了一個清晰的解釋和簡單的解決方案。所以我希望爲它開闢一個新的話題是值得的。

僅供參考,以解決這個問題,我試圖讓服務器端的方法:

Meteor.users.findOne({_id:'this.userId'}); 

,並把它稱爲從客戶端。它仍然得到未定義的結果....

+3

你的其他部分沒有任何回報和'Meteor.user()emails.address'does不存在的,因爲電子郵件是一個數組所以唯一的辦法可能。成爲'Meteor.user()。emails [0] .address'。在引號中使用this.userId使它成爲一個字符串,因此它試圖找到一個用戶名,該用戶的ID爲'this.userId'。如果你留下引號,它應該使用你的userId找到一個用戶。您可以閱讀更多關於JS語法和語義的內容,以提高對語言概念的理解。 – Jankapunkt

+0

我完全忘記了email屬性是一個數組。我的愚蠢問題。非常感謝。 – cxg222

回答

0

您正在僅僅指剛一null檢查,何談其他「falsy」值檢查,必須正確使用如下代碼,

loginEntranceContent(){ 
    if (!Meteor.userId()) { 
     return 'Log in/Sign up'; 
    } else if(Meteor.user() && Meteor.user().emails && Meteor.user().emails[0].address){ 
      return Meteor.user().emails[0].address; 
    } else { 
     //do something here. 
    }; 
}, 

和因爲你已經不是我們顯示的代碼從客戶端調用流星方法,如@Jankapunkt建議在服務器端,如下使用代碼,

Meteor.users.findOne({_id : this.userId}); 

注意:流星提供了一個美麗的API管理User-Accounts