我正在使用 Meteor methods避免在客户端更新数据库但仍然出现此错误:
Uncaught Error: Not permitted. Untrusted code may only remove documents by 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);
}
}
});
}
编辑:我应该提到,即使出现该错误,该应用程序在本地主机上仍然可以正常工作,但是当我将它部署到 meteor 的测试服务器之一时,该应用程序不起作用(并且仍然显示该错误)。
最佳答案
您正在客户端上运行代码。您有两种选择可以立即解决问题:
- 将方法定义放在应用的
/server
目录下的文件中。 - 将方法定义包装在
if (Meteor.isServer) {}
block 中。
实际发生错误是因为该方法正在客户端上运行(见上文)并使用非基于 id 的选择器更新集合。例如:
Posts.update({awesome: false}, {...});
而在客户端上,您只能进行如下更新:
Posts.update(postId, {...});
如果你喜欢保留latency compensation并尽可能编写一个客户端 stub ,但您需要修改您的更新,如上面第二个示例所示。
推荐阅读:Structuring your application .
关于javascript - 使用 meteor 方法但仍然出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31436155/