2014-06-11 2 views
1

Dans mon application, un utilisateur a la possibilité de supprimer toutes ses notifications. En tant que gestionnaire d'événements, j'ai ceci:Supprimer les enregistrements par userId non autorisés

Template.clearNotifications.events({ 
    'click .clear-notifications': function() { 
    Notifications.remove({userId: Meteor.user()._id}); 
    } 
}); 

Quand il est appelé, je reçois cette erreur:

Uncaught Error: Not permitted. Untrusted code may only remove documents by ID. [403] 

Est-ce une permission, j'oublié d'ajouter, ou est-il généralement pas autorisés à le faire ? Et si oui, quelles sont mes options pour supprimer les notifications de l'utilisateur?

Répondre

1

Sur le client, météore permet seulement la suppression des documents par id. Heureusement, il y a une solution facile - il suffit de parcourir l'ensemble du l'utilisateur actuel des notifications et supprimer chacun:

Template.clearNotifications.events({ 
    'click .clear-notifications': function() { 
    Notifications 
     .find({userId: Meteor.userId()}) 
     .forEach(function(notification) { 
     Notifications.remove(notification._id); 
     }); 
    } 
}); 

Gardez à l'esprit que cela ne supprime les notifications que le client a connaissance (ceux qui ont été publiés). Si d'autres notifications dans la base de données doivent également être supprimées (vous n'avez peut-être publié que les 10 documents les plus récents), vous devez utiliser un method. Par exemple:

Meteor.methods({ 
    removeAllNotifications: function() { 
    Notifications.remove({userId: this.userId}); 
    } 
}); 

Que vous pouvez invoquer le client:

Meteor.call('removeAllNotifications'); 
+0

Merci Dave, c'est exactement ce que je cherchais. Et je ne me suis pas rendu compte que la suppression du client ne fait que supprimer les publications! – John

0

Retrait dans la zone non sécurisée (client) ne fonctionne que lorsque vous passez _id du document:

var notification = Notifications.findOne({userId:Meteor.userId()}); 
Notifications.remove({_id:notification._id}) 

Explication:

The behavior of remove differs depending on whether it is called by trusted or untrusted code. Trusted code includes server code and method code. Untrusted code includes client-side code such as event handlers and a browser's JavaScript console.

Trusted code can use an arbitrary Mongo selector to find the documents to remove, and can remove more than one document at once by passing a selector that matches multiple documents. It bypasses any access control rules set up by allow and deny. The number of removed documents will be returned from remove if you don't pass a callback.

As a safety measure, if selector is omitted (or is undefined), no documents will be removed. Set selector to {} if you really want to remove all documents from your collection.

Untrusted code can only remove a single document at a time, specified by its _id. The document is removed only after checking any applicable allow and deny rules. The number of removed documents will be returned to the callback.

http://docs.meteor.com/#remove

+0

OK, mais si j'ai plusieurs notifications, comment puis-je les itérer? – John

+0

Le code de confiance (côté serveur) peut le faire. Créer une méthode côté serveur qui supprime les notifications sélectionnées par un sélecteur Mongo arbitraire. –

Questions connexes