Je suis nouveau dans le monde de node.js, donc j'ai le sentiment que c'est quelque chose de stupide que j'ai négligé, mais je n'ai pas été capable de trouver une réponse qui résout mon problème. Ce que j'essaie de faire est de créer un chemin qui va créer un nouvel objet enfant, l'ajouter au tableau des enfants du parent, puis retourner l'objet enfant au demandeur. Le problème que je rencontre est que si je passe la chaîne id dans findById, le nœud se plante avec
Erreur de type : Object {} ne possède pas de méthode 'cast'.
Si j'essaie de passer un ObjectId à la place, j'obtiens
CastError : Le transfert vers ObjectId a échoué pour la valeur "[objet Object]" au niveau du chemin "_id".
Voici un aperçu de mon code :
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId
mongoose.connect('mongodb://user:password@server:port/database');
app.get('/myClass/:Id/childClass/create', function(request, result) {
var id = new ObjectId(request.params.Id);
MyClass.findById(id).exec( function(err, myClass) {
if (err || !myClass) { result.send("error: " + err + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
var child = ChildClass();
myClass.Children.addToSet(child);
myClass.save();
result.send(child);
});
});
Si j'exécute ce code avec le chemin "/myClass/51c35e5ced18cb901d000001/childClass/create", voici le résultat du code :
erreur : CastError : Le transfert vers ObjectId a échoué pour la valeur "[objet Object]" au chemin "_id". {"path":"51c35e5ced18cb901d000001","instance":"ObjectID","validators":[],"setters":[],"getters":[],"_index":null}
J'ai essayé d'utiliser findOne et de passer {_id:id} à la place, mais il semble que ce soit exactement ce que fait findById. J'ai essayé les différentes classes pour ObjectId que j'ai vues sur d'autres sites. J'ai essayé d'appeler ObjectId() comme une fonction au lieu d'un constructeur et cela renvoie undefined. À ce stade, je suis à court d'idées et il ne semble pas que la recherche d'une réponse sur Google m'aide. Avez-vous une idée de ce que je fais de mal ?
De plus, comme je l'ai dit, je suis novice en matière de node/Mongo/Mongoose/Express, donc s'il existe une meilleure façon d'atteindre mon objectif, faites-le moi savoir. J'apprécie tous les commentaires.
EDIT :
Après la solution de Peter Lyons, j'ai cherché sur Google une autre erreur que je rencontrais et j'ai trouvé findByIdAndUpdate, qui fonctionne comme prévu et fait exactement ce que j'espérais faire. Je ne suis toujours pas sûr de la raison pour laquelle findById et findOne me posaient de tels problèmes et je suis curieux de le savoir (peut-être qu'un rapport de bogue doit être rempli), donc je laisse cette question ouverte au cas où quelqu'un d'autre aurait une réponse.