Utilisez la syntaxe Async/Await :
const findUser = async function (params) {
try { return await User.findOne(params)
} catch(err) { console.log(err) }
}
const userSteve = findUser({firstName: Steve})
Chaque fois que vous avez besoin d'utiliser les informations d'une requête, utilisez le préfixe await
dans une fonction async
. Cela vous permettra d'utiliser la nature asynchrone d'une requête Mongoose dans un code synchrone qui a besoin du résultat de cette requête pour continuer.
Pour votre code :
coreModule.findUser = async function (userId) {
return await User.findOne({id:_userId})
}
coreModule.findPosts = async function(authorId) {
return await Posts.find({postedBy: authorId})
}
const foundUser = coreModule.findUser(123);
const foundPosts = coreModule.findPosts(123);
res.send({user: foundUser, posts: foundPosts})
Si vous souhaitez que les deux requêtes s'exécutent simultanément, vous pouvez utiliser Promise.all()
coreModule.findUser = function (userId) {
return User.findOne({id:_userId})
}
coreModule.findPosts = function(authorId) {
return Posts.find({postedBy: authorId})
}
const [foundUser, foundPosts] =
await Promise.all(
[coreModule.findUser(123), coreModule.findPosts(123)]
);
res.send({user: foundUser, posts: foundPosts})
Si vous avez les deux requêtes situées à des EndPoints séparés dans votre API, vous pouvez également construire deux requêtes fetch visant ces deux endpoints et les exécuter simultanément côté client avec Promise.all()
J'espère que cela vous a aidé !
Éditer : J'ai modifié mon post avec cet exemple fonctionnel que j'ai testé dans mon API :
module.exports.test = async function(req, res, next) {
const module1 = function(params) {
return ShoppingCartModel.find({_id: params})
}
const module2 = function(params) {
return User.find({_id: params})
}
const array = [module1('5a739dbc45424d2904faca5b'), module2('5a739dbc45524d2904faca5b')]
const promise = await Promise.all(array)
res.json(promise)
}
Quelques exemples de retours incorrects :
Incorrect :
const array = [ShoppingCartModel.find({}), ShoppingCartModel.find({})]
// console.log(array) = Constructeurs de requête Mongoose
const promise = Promise.all(array)
// console.log(promise) = Promise { }
Correct :
const array = [ShoppingCartModel.find({}), ShoppingCartModel.find({})]
const promise = await Promise.all(array)
Incorrect :
// Retourner une promesse complète à partir de la requête Mongoose en utilisant .exec()
const array = [ShoppingCartModel.find({}).exec(), ShoppingCartModel.find({}).exec()]
// console.log(array) = [ Promise { }, Promise { } ]
const promise = Promise.all(array)
// console.log(promise) = Promise { }
Correct :
const array = [ShoppingCartModel.find({}).exec(), ShoppingCartModel.find({}).exec()]
const promise = await Promise.all(array)
Vous devez attendre le résultat de Promise.all
, sinon votre fonction passera à travers les appels de fonction, enverra un objet JSON vide au front-end, et console.log des promesses en attente qui n'ont pas le temps de se résoudre