在我的应用中,用户可以选择删除所有通知。作为一个事件处理程序,我有这个:
Template.clearNotifications.events({
'click .clear-notifications': function() {
Notifications.remove({userId: Meteor.user()._id});
}
});
调用它时,我收到此错误:
Uncaught Error: Not permitted. Untrusted code may only remove documents by ID. [403]
这是我忘记添加的权限,还是通常不允许这样做?如果是这样,我可以选择删除用户的通知吗?
答案 0 :(得分:1)
在客户端上,meteor只允许通过id删除文档。幸运的是,有一个简单的解决方案 - 只需迭代所有当前用户的通知并删除每个通知:
Template.clearNotifications.events({
'click .clear-notifications': function() {
Notifications
.find({userId: Meteor.userId()})
.forEach(function(notification) {
Notifications.remove(notification._id);
});
}
});
请记住,这只会删除客户知道的通知(已发布的通知)。如果数据库中还有其他通知需要删除(可能您只发布了10个最新文档),则需要使用method。例如:
Meteor.methods({
removeAllNotifications: function() {
Notifications.remove({userId: this.userId});
}
});
您可以使用以下命令从客户端调用
Meteor.call('removeAllNotifications');
答案 1 :(得分:0)
在不受信任的区域(客户端)中删除仅在您传递文档的 _id 时有效:
var notification = Notifications.findOne({userId:Meteor.userId()});
Notifications.remove({_id:notification._id})
说明:
删除的行为取决于它是由受信任的代码还是不受信任的代码调用。可信代码包括服务器代码和方法代码。不受信任的代码包括客户端代码,例如事件处理程序和浏览器的JavaScript控制台。
受信任的代码可以使用任意Mongo选择器来查找要删除的文档,并且可以通过传递匹配多个文档的选择器一次删除多个文档。它绕过allow和deny设置的任何访问控制规则。如果您没有通过回调,将从删除文件中返回已删除文档的数量。
作为安全措施,如果省略选择器(或未定义),则不会删除任何文档。如果您确实要从集合中删除所有文档,请将选择器设置为{}。
不受信任的代码一次只能删除由_id指定的单个文档。只有在检查了任何适用的允许和拒绝规则后,才会删除该文档。删除的文档数将返回给回调。