2014-05-09 3 views
0

Pourquoi cette mise à jour échoue-t-elle? C'est basique, je l'ai fait beaucoup d'autres fois. Cette requête ci-dessus a même été simplifiée par rapport à ce qu'elle était à l'origine, et elle a toujours le même problème. Au départ, je compilait la mise à jour programatically:Mise à jour de Meteor Mongo Requête invalide

console.log(obj); 
console.log(id); 
if (obj) collection.update(id, obj); 

Voici ma sortie exacte de ces lignes:

Object {$set: Object} 
    $set: Object 
     lastname: "Archer" 
     __proto__: Object 
     __proto__: Object 
main.js?b9104f881abb80f93da518738bf1bfb4cab0b2b6:68 

YXeudfnHyKmsGXaEL 
main.js?b9104f881abb80f93da518738bf1bfb4cab0b2b6:69 

update failed: MongoError: invalid query 
debug.js:41 

Le id est correct, et si le obj a quelque chose de mal avec elle, ce sera nouvelles à moi!

Maintenant, je suis assez positif que cela n'a rien à voir avec ma fonction allow. Dans les premiers tests de cette partie de mon programme, j'ai effectivement obtenu l'erreur update not allowed (ou quoi que ce soit), mais j'ai modifié ma fonction allow pour prendre cela en compte, et cette erreur est partie.

Voici ma fonction allow. J'ai un système d'utilisateur où un utilisateur peut avoir un objet étudiant qui «reflète» son information de nom, d'où la complexité ajoutée. Cette partie de la fonction n'est engagée que dans certaines circonstances, et elle ne modifie pas le comportement de l'allocation.

Meteor.users.allow({ 
    update: function (userId, doc, fields, modifier) { 
     var allow = (userId && (doc._id === userId) && _.without(fields, 
        'firstname', 'lastname', 'student_ids', 'payment_ids', 'phones').length == 0) || Meteor.user().admin; 
     if (allow && modifier.$set && (_.contains(fields, 'firstname') || _.contains(fields, 'lastname'))) { 
      var user = Meteor.users.findOne(userId); 
      var obj = {}; 
      if (modifier.$set.firstname) obj.firstname = modifier.$set.firstname; 
      if (modifier.$set.lastname) obj.lastname = modifier.$set.lastname; 
      if (obj) Students.update({_id: {$in: user.student_ids}, reflectsUser: true}, {$set: obj}); 
     } 
     return allow; 
    } 
}); 
+1

est-ce sur le client ou le serveur? et si sur le client: le 'allow's approprié est-il placé sur le serveur? Aussi, as-tu vérifié que 'id' est bien un identifiant valide? –

+0

C'est sur le client. Et oui, j'ai imprimé ce 'id' et c'est correct – blaineh

+0

Avez-vous essayé d'utiliser {_id: id} au lieu de id? Comme ceci: 'Meteor.users.update ({_ id: id}, {$ set: {lastname:" Archer "}});' – stubailo

Répondre

1

Il se trouve ma allow fonction était le problème, mais un peu d'une façon sournoise.

Le celui qui périclite appel Meteor.users.update n'a pas été fait, ce fut celui-ci:

Students.update({_id: {$in: user.student_ids}, reflectsUser: true}, {$set: obj}); 

Je ne vérifiait pas correctement que user.student_ids champ, donc si elle était undefined (que l'utilisateur n'a pas avoir des étudiants) alors la requête était invalide. Jeter dans une ligne pour examiner ce tableau:

var student_ids = user.student_ids || []; 

a résolu le problème.

Puisque l'erreur Meteor ne m'a pas indiqué quelle requête était invalide, elle m'a conduit sur un peu d'une chasse aux oies sauvage. Va juste à montrer que de bonnes erreurs peuvent aller un long chemin!

En outre, effectuer des requêtes de base de données qui ont d'autres requêtes de base de données comme effets secondaires est quelque chose à faire très attentivement.

Questions connexes