2012-10-12 86 views
6

我正在使用流星4.2(Windows),並且我總是收到「更新失敗:403-訪問被拒絕,無法在限制集合中替換文檔」更新我的集合中的一個對象。奇怪的是我插入新的沒有問題,只有更新失敗。流星:無法替換限制集合中的文檔

我嘗試 「允許」 我的收藏所需的一切:

Maps.allow({ 
    insert: function() { return true; }, 
    update: function() { return true; }, 
    remove: function() { return true; }, 
    fetch: function() { return true; } 
}); 

但儘管如此,這個更新失敗:

Maps.update({ 
    _id: Session.get('current_map') 
}, { 
    name: $('#newMapName').val() 
}); 

有沒有別的東西,我可以檢查?或者,也許我的代碼是錯誤的?上次我與我的項目一起玩的是以前版本的Meteor(< 4.0)。

感謝您的幫助。注:僅供參考,當我執行此更新時,本地集合已更新,我可以看到UI中的更改。然後很快它會與錯誤消息一起恢復,因爲更改已被服務器端拒絕。

回答

8

好的,語法實際上是不正確的。我真的不明白爲什麼,因爲它以前工作良好,但無論如何,這裏要說的是正常工作的代碼:

Maps.update({ 
    Session.get('current_map') 
}, { 
    $set: { 
     name: $('#newMapName').val() 
    } 
}); 
+0

這是$設置位(要保存的內容必須包裝在$ set中),我只是遇到了這個問題,並感謝您的回答我發現我的意外,謝謝:) –

+0

謝謝,你救了我的一天: d – Nick

0

現在看來似乎必須與你在「current_map」存儲是什麼會話變量。如果它是一個數據庫對象,那麼它可能看起來像{_id:<mongo id here>}這將使更新查找程序正常工作。

我遇到了同樣的問題,並找到了塊I以下工作

Blocks.update {_id:block_id}, {$set: params} 

其中params爲所有位的散列我想更新和BLOCK_ID蒙戈對象ID正在嘗試更新。

有關客戶端更新(閃爍更新然後恢復)的說明是預期的行爲。如果你看看他們的文檔Data and Security section

雖然流星有一個可愛的把戲。當客戶端向服務器發出寫入時,它也會立即更新其本地緩存,而無需等待服務器的響應。這意味着屏幕將立即重繪。如果服務器接受了更新 - 大多數情況下應該在正常運行的客戶端中發生 - 那麼客戶端就會跳轉到更改位置,而不必等待往返更新自己的屏幕。如果服務器拒絕更改,則Meteor會使用服務器的結果來修補客戶端的緩存。