2016-12-02 245 views
1

我不確定這是否是對React和Meteors連接的限制,因爲文檔建議它應該可能沒有額外的參數。反應和流星訂閱

當我在響應中調用流星訂閱時,如果我沒有在查詢中明確聲明參數,它將返回任何數據,忽略publish函數中的指定數據。

Meteor.publish("supplier", function() { 
    if(this.userId) { 

     var user = Meteor.users.findOne(this.userId, { fields : { active : 1 }}); 
     if(user.active != this.userId || user.active != undefined){ 

     // This only returns 1 singular supplier - is correct 
     var supplier = Supplier.find({ _id : user.active, users : this.userId }); 
     return supplier; 

     } else { 
     return this.ready(); 
     } 
    } else { 
     return this.ready(); 
    } 
}); 

現在我所說的認購反應,如使

getMeteorData: function() { 

    var data = {} 

    handle = Meteor.subscribe("supplier"); 

    if(handle.ready()) { 
     data.supplier = Supplier.findOne(); // Returns Wrong supplier 
     //data.supplier = Supplier.findOne({_id: session.get("active")}) // Returns correct supplier 
     data.supplierReady = true 
    } 

    return data; 

    }, 

這將返回第一供應商集合中沒有一個記錄在服務器上的發佈功能!但是,如果我明確地通過{ _id : user.active}它的作品!

現在我的理解是,通過執行publish函數中的服務器上的邏輯,我可以簡單地使用Supplier.findOne(),但事實並非如此,我不明白爲什麼。這是對React/Meteor的限制還是我實施這個錯誤?

回答

2

這不是一個特定於反應的問題,它是findOne工作方式的結果。如果您的客戶端Supplier集合中包含一個或多個文檔,則Supplier.findOne()只會抓取第一條可用的記錄,而不參考剛剛從訂閱中獲取的文檔。

這意味着:(a)由於其他預先訂閱,您在客戶端有多個供應商可用;或者(b)您從handle訂閱返回多個供應商。

檢查訂閱handle之前的客戶端集合的狀態。如果有一個或多個文檔,那是您的應用程序的預期狀態,那麼修改客戶端findOne以像以前一樣添加{_id: user.active}

+0

嗨,傑里米。感謝您提供豐富的答案。我現在瞭解委託人,問題是多個訂閱供應商集合必須存在(如您可以在供應商之間切換)。如果您能夠通過'檢查客戶端收集的狀態'來闡述或解釋您的意思,我很感興趣。你的意思只是一個計數或查詢來檢查客戶端集合? – Allreadyhome

+1

是的,我的意思是您可以在訂閱運行之前查看客戶端集合。你可以通過console.log find().fetch()或find()。count()來快速查看,或者你可以使用其中一個可用的工具來更仔細地檢查集合。我真正喜歡和使用的是https://github.com/bakery/meteor-devtools-有些人喜歡使用蒙古語。因爲您不必在代碼或控制檯中輸入命令,所以它們使它變得更容易一些。 –

+0

關於開發工具的好建議。謝謝! – Allreadyhome