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