2013-02-13 24 views
1

用於用戶數據,我有一個發佈/訂閱,看起來像這樣:流星用戶配置文件只能讀取刷新後

Meteor.publish("allUserData", function() { 
    return Meteor.users.find({}, { 
      fields: { "emails": 1, "_id": 1, "profile": 1 } 
     } 
    ); 
}); 

Meteor.subscribe("allUserData"); 

但是,當我嘗試讀取配置文件,它總是不確定的,直到我刷新頁面,然後我可以閱讀它。 我試圖讀取配置文件如下:

Meteor.user().profile 

我在做什麼錯?爲什麼當我刷新頁面時它工作,但不是在初始加載時?我已經嘗試了發佈函數中帶有和不帶引號的屬性名...

+0

您可以在您用來閱讀用戶檔案的部分上提供一些代碼嗎? – Akshat 2013-02-13 09:01:19

+0

我想我問的是你可以給你一些關於如何在什麼情況下使用'Meteor.user().profile'的信息?如果您在刷新之前等待一下,是否有幫助?這是在你的本地主機上? – Akshat 2013-02-13 13:17:17

+0

是的,我需要等一下。我不明白爲什麼,但是這解決了我的問題......謝謝! – 2013-02-13 13:54:50

回答

2

Meteor.user().profile直到Meteor.user()之後幾分之一秒纔可用。另外,創建用戶帳戶時,它沒有配置文件。解決方案是在反應函數中使用超時。

Meteor.autorun(function(handle) { 
    if (Meteor.user()) { 
    if (Meteor.user().profile) { 
     // use profile 
     handle.stop() 
    } 
    else { 
     setTimeout(function(){ 
     if (!Meteor.user().profile) { 
      // new user - first time signing in 
      Meteor.users.update(Meteor.userId(), { 
      $set: { 
       'profile.some_attribute': some_value 
      } 
      }) 
     } 
     }, 2000) 
    } 
    } 
}) 
+0

我對配置文件不瞭解。爲什麼不能立即使用?另外,對於我的特殊情況,我將配置文件屬性傳遞給訂閱方法,因此將訂閱包裝到Meteor.autos訂閱中導致訂閱工作,解決了我的問題。 – 2013-02-13 13:53:00

+0

哦,我明白了。是的,自動訂閱可能更適合您的情況。重要的是使用反應函數。我懷疑配置文件不能立即使用,因爲配置文件可能變得隨意變大,因此可能會顯着延遲客戶端檢索_id和電子郵件。 – ram1 2013-02-13 15:16:20

+1

今天取消了Autosubscribe。如果您升級到0.5.5,請改用autorun。 – ram1 2013-02-14 02:54:40