Meteor:无法替换限制集合中的文档

时间:2012-10-12 09:40:33

标签: meteor

我正在使用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中的更改。然后很快就会将其与错误消息一起还原,因为服务器端已拒绝更改。

2 个答案:

答案 0 :(得分:8)

好吧,语法实际上是不正确的。我真的不明白为什么它之前运作良好,但无论如何,这里的代码运行良好:

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

答案 1 :(得分:0)

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

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

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

其中params是我要更新的所有位的散列,block_id是我想要更新的Block的mongo对象id。

您对客户端更新(闪烁更新然后还原)的说明是预期的行为。如果您在Data and Security section

下查看了他们的文档
  不过,流星有一个可爱的伎俩。当客户端向服务器发出写入时,它还会立即更新其本地缓存,而不必等待服务器的响应。这意味着屏幕将立即重绘。如果服务器接受了更新 - 大多数情况下应该在正常运行的客户端中发生什么 - 那么客户端就可以跳转更改并且不必等待往返更新自己的屏幕。如果服务器拒绝更改,Meteor将使用服务器的结果修补客户端的缓存。