我使用Meteor methods来避免在客户端更新数据库但仍然收到此错误:
未捕获错误:不允许。不受信任的代码只能按ID删除文档。 [403]
在为accounts-ui包配置Facebook和Twitter登录之前,我没有注意到它会影响应用程序。同样,我在客户端执行的唯一数据库操作是查找。
if(Meteor.isClient) {
$scope.deleteTask = function(task) {
$meteor.call("deleteTask", task._id);
};
}
if(Meteor.isServer) {
Meteor.methods({
deleteTask: function (taskId) {
var task = Tasks.findOne(taskId);
if (task.owner !== Meteor.userId()) {
alert("Only a tasks owner may delete the task.")
throw new Meteor.Error("not-authorized");
}
else {
Tasks.remove(taskId);
}
}
});
}
编辑:我应该提一下,即使出现该错误,该应用程序仍然可以在localhost上正常工作,但是当我将其部署到某个测试服务器时,它仍无效(并且仍然显示错误)。
答案 0 :(得分:2)
您正在客户端上运行代码。您有两种选择可以立即解决问题:
/server
目录下的文件中。if (Meteor.isServer) {}
块内。实际发生错误的原因是该方法在客户端上运行(参见上文)并使用非基于id的选择器更新集合。例如:
Posts.update({awesome: false}, {...});
在客户端上,您只能进行以下更新:
Posts.update(postId, {...});
如果您希望保留latency compensation并编写客户端存根,则可以,但您需要修改更新,如上面第二个示例所示。
答案 1 :(得分:1)
发现它来自我的accounts-ui配置,完全不同的文件!