2016-01-02 134 views
3

我一直在使用共享方法一段時間,但仍然無法弄清楚他們在某些情況下的行爲。流星延遲補償和日期()

當我打電話共享的方法,這將插入一個像這樣的文件:

Meteor.methods({ 
    'method': function(){ 
    Posts.insert({ 
     'timestamp': new Date() 
    }); 
    } 
}) 

...將延遲補償仍能正常工作,考慮到時間()將在客戶端和服務器,這意味着在不同無論如何,服務器將自己的版本發送給客戶端。如果是這樣,是否有任何解決方法,或者我們應該只使用時間戳服務器端插入方法?

+1

MeteorPad在Meteor.isServer和Meteor的服務器端方法體中引入了一些虛假的延遲。setTimeout'在這裏可以回答這個問題。我稍後會看到關於製作一個。 –

回答

1

簡短回答,是的,即使日期插入,延遲補償也可以工作。但無論日期被插入到Minimongo客戶端,最終都會被服務器覆蓋。

的一系列事件看起來是這樣的:

  1. (客戶端)客戶端運行的版本的方法,插入Date到Minimongo posts集合。假設客戶認爲它是04:31:03 UTC,實際上它是04:33:44 UTC。無論如何,現在你有一個文檔客戶端與一個「不正確」的時間戳。這是延遲補償的行動,這是好的 - 我們不會等待服務器完成插入,即使UI不正確,我們也會立即渲染UI。
  2. (服務器)同時,服務器被告知執行相同的插入。但服務器知道正確的時間,並將時間04:33:44 UTC插入到Mongo中。
  3. (客戶端)你的客戶可能訂購了posts收集,並立即服務器的插入完成後,您posts訂閱觀察變化的收集和過DDP文件發送給客戶端。
  4. (客戶端) Minimongo將此新傳入服務器posts文檔與其自己的集合合併。在此過程中,它會使用正確的服務器生成時間覆蓋錯誤的時間。任何相關的用戶界面都會被動更新並反映這一變化。

基爾河建議一個MeteorPad,所以here's a very basic example。點擊「單擊我測試時間戳」,您會注意到它下面的毫秒顯示會閃爍兩次:第一次客戶端使用自己的時間戳進行更新,第二次使用ITS時間戳時服務器返回。如果您查看客戶端和服務器日誌,您會發現這是事實。

有點囉嗦,但希望這有助於!如果您需要的服務器信任並重新使用客戶端生成的日期,只需將Date對象作爲參數傳遞給你的方法一樣

'method': function(date) { 
    check(date, Date); 
    Posts.insert({timestamp: date}); 
} 

但是,您通常希望服務器是真理的來源你的時間戳。你永遠不能相信客戶知道什麼時候是真的!