2011-04-15 6 views
0

Je construis une application node.js en utilisant mongoDB. Je dois créer un objet livre, l'enregistrer et l'ajouter à la liste des livres d'un utilisateur. Je dois alors avoir un "sauvegarder" pour le livre puis un second pour l'utilisateur (pour lequel la liste des livres a été mise à jour).node.js et mongoose: comment appeler 2 méthodes de callback imbriquées à sauvegarder dans une liste de collection et imbriquée?

je fais quelque chose comme:

book = new Book(); // I'm using moogoose 
book.title = req.params.title 
book.save(function(err){ 
    if(!err){ 
    jsonObj = {"title":book.title}; 
    res.writeHead(200, {'content-type': 'application/json'}); 
    res.write(JSON.stringify(jsonObj)); 
    res.end(); 

    // Add book in user things list 
    user.books.push(book); 
    user.save(function(error){ 
     if(error) { 
     console.log(JSON.stringify({ "error" : "internal error" })); 
     } 
    }); 
    } else { 
    jsonObj = { "error" : "internal error while saving book" }; 
    res.writeHead(200, {'content-type': 'application/json'}); 
    res.write(JSON.stringify(jsonObj)); 
    res.end(); 
    } 
    console.log(JSON.stringify(jsonObj)); 
}); 

Il semble que, parfois, le livre est enregistré dans le DB et la liste non enregistrées dans les livres de l'utilisateur, et il est parfois l'inverse. Je ne suis pas familier avec la méthode de callback asynch (imbriquée en plus de ça ...).

Je fais sûrement quelque chose de mal ... Quelle est la meilleure façon de faire cela?

+0

Si une erreur survient lors de l'enregistrement du livre, votre livre ne sera pas ajouté à la liste des utilisateurs. – Raynos

+0

@Raynos, mais parfois le livre est enregistré seul mais pas enregistré dans la liste des livres de l'utilisateur. – Luc

+0

c'est ce que j'ai dit. Le livre peut être sauvegardé seul, mais une erreur différente empêche le livre d'être ajouté à la liste des utilisateurs. Donc, essayez 'console.log (err)' dans votre bloc else. – Raynos

Répondre

1

Je ne suis pas trop sûr moi-même, mais je pense que Mongo économise deux objets différents du livre, car il les considère comme deux objets différents (même pour Javascript le livre le tableau d'utilisateur et l'objet pointent vers la même chose).

Vous ferez mieux d'enregistrer l'objet Livre dans Mongo. Obtenez le _ObjectID (généré par MongoDB) et enregistrez-le dans le tableau des livres d'utilisateurs.

0

Pour des fins de débogage changer votre code:

} else { 
    console.log("error saving book : ", err); 
    jsonObj = { "error" : "internal error while saving book" }; 
    res.writeHead(200, {'content-type': 'application/json'}); 
    res.write(JSON.stringify(jsonObj)); 
    res.end(); 
} 
+0

@Raynos ... hmm en fait je pense que c'est ma compréhension de Mongoose qui n'est pas correcte (http://mongoosejs.com/docs/embedded-documents.html), il semble que je finisse par créer 2 différents livres dans ma cas (c.-à-d. je veux créer seul, puis un dans l'utilisateur). Je ne suis pas sûr que ce soit la bonne approche. – Luc

Questions connexes