6

我正在使用 Meteor 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)。

谢谢你的帮助。

PS:仅供参考,当我进行此更新时,本地集合已更新,我可以在 UI 中看到更改。然后很快它与错误消息一起恢复,因为更改已被服务器端拒绝。

4

2 回答 2

8

Alright, the syntax was actually incorrect. I don't understand really why as it was working well before, but anyway, here is the code that works fine:

Maps.update({ 
    Session.get('current_map') 
}, {
    $set: { 
        name: $('#newMapName').val()
    }
});
于 2012-10-15T01:36:44.413 回答
0

似乎它必须与您在“current_map”会话变量中存储的内容有关。如果它是一个 db 对象,那么它可能看起来{_id:<mongo id here>}会让更新查找器正常工作。

我遇到了同样的问题,发现以下工作

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

其中 params 是我要更新的所有位的哈希,而 block_id 是我要更新的 Block 的 mongo 对象 id。

您关于客户端更新(闪烁更新然后恢复)的注释是预期的行为。如果您在数据和安全部分查看他们的文档:

不过,Meteor 有一个可爱的技巧。当客户端向服务器发出写入时,它也会立即更新其本地缓存,而无需等待服务器的响应。这意味着屏幕将立即重绘。如果服务器接受了更新——在正常行为的客户端中大部分时间都应该发生这种情况——那么客户端就会对更改进行跳转,而不必等待往返更新自己的屏幕。如果服务器拒绝更改,Meteor 会使用服务器的结果修补客户端的缓存。

于 2013-02-05T16:35:45.890 回答