Interroger Mongoose plusieurs fois sans imbriquer

J’essaie de générer un document avec node.js qui doit exécuter plusieurs requêtes de firebase database non liées à partir d’une firebase database Mongo.

Voici mon code actuel:

Data.find({}, function(err, results) { if (err) return next(err); //finished getting data res.render('page'); } } 

Le problème est que si j’essaye d’exécuter une autre requête, il me semble qu’il faut l’imbriquer dans la première pour qu’elle attende que la première finisse avant de commencer, puis je dois mettre res.render () dans l’imbrication la plus interne. requête (si je ne le fais pas, res.render () sera appelé avant que la firebase database ait fini de récupérer les données, et elles ne seront pas restituées avec la page).

Ce que je dois faire:

 Data.find({}, function(err, results) { if (err) return next(err); //finished getting data Data2.find({}, function(err, results2) { if (err) return next(err); //finished getting data 2 res.render('page'); } } } } 

Je vais avoir plus de 2 requêtes, donc si je continue à les imbriquer, cela va devenir vraiment très compliqué. Existe-t-il un moyen plus propre de le faire, tel qu’un moyen de faire en sorte que le code attende que toutes les données soient renvoyées et que la fonction soit exécutée avant de poursuivre le script?

Pour les mongooses, vous pouvez probablement juste faire un Promise.all() et utiliser .concat() sur les tableaux résultants de chaque requête.

En démo complète:

 var async = require('async'), mongoose = require('mongoose'), Schema = mongoose.Schema; var d1Schema = new Schema({ "name": Ssortingng }); var Data1 = mongoose.model("Data1", d1Schema); var d2Schema = new Schema({ "title": Ssortingng }); var Data2 = mongoose.model("Data2", d2Schema); mongoose.set('debug',true); mongoose.connect('mongodb://localhost/test'); async.series( [ // Clean function(callback) { async.each([Data1,Data2],function(model,callback) { model.remove({},callback) },callback); }, // Setup some data function(callback) { async.each([ { "name": "Bill", "model": "Data1" }, { "title": "Something", "model": "Data2" } ],function(data,callback) { var model = data.model; delete data.model; mongoose.model(model).create(data,callback); },callback); }, // Actual Promise.all demo function(callback) { Promise.all([ Data1.find().exec(), Data2.find().exec() ]).then(function(result) { console.log([].concat.apply([],result)); callback() }).catch(callback); } ], function(err) { if (err) throw err; mongoose.disconnect(); } ) 

Je ne fais que mélanger async ici pour la brièveté de l’exemple, mais sa substance réside dans:

  Promise.all([ Data1.find().exec(), Data2.find().exec() ]).then(function(result) { console.log([].concat.apply([],result)); }) 

Promise.all() attend et combine les deux résultats, ce qui serait un “tableau de tableaux” mais le .concat() s’en charge. Le résultat sera:

 [ { _id: 59420fd33d48fa0a490247c8, name: 'Bill', __v: 0 }, { _id: 59420fd43d48fa0a490247c9, title: 'Something', __v: 0 } ] 

Affichage des objects de chaque collection, réunis dans un tableau.

Vous pouvez également utiliser la méthode async.concat comme alternative, mais à moins que vous utilisiez déjà la bibliothèque, il est probablement préférable de respecter les promesses.