Je dois renvoyer les résultats d'une requête avec mangouste dans node.js.
Comment renvoyez-vous la valeur pour définir la valeur sur une variable?
Ce que je dois faire c'est:
var results = users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) {
if( err || !docs) {
console.log("No user found");
} else {
return docs;
};
});
Dans le but d'avoir:
results = docs
Merci beaucoup pour votre réponse.
J'ai aussi un autre problème.
Comment passer variable dans un opérateur de requête avec find ou findOne? Comme :
var foo = "Blaa";
users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) {
if( err || !docs) {
console.log("No user found");
} else {
// I want to use the foo variable here
console.log(foo);
};
});
Il y a plusieurs façons de réaliser ce que vous voulez.
1. Utilisation de requêtes Mongoose
Dans cette stratégie, votre fonction renvoie une requête Mongoose que vous pourrez utiliser par la suite pour appeler la méthode exec
et l’utiliser pour obtenir les résultats.
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
Ensuite, vous pouvez l'utiliser simplement en faisant:
var query = getJedisQuery('Obi-wan');
query.exec(function(err,jedis){
if(err)
return console.log(err);
jedis.forEach(function(jedi){
console.log(jedi.name);
});
});
2. Utilisation d'objets de type Mongoose Promise
Moogose prend en charge les objets de type promesse. Tout ce que vous avez à faire est quelque chose de similaire à ce que j'ai fait ci-dessus, mais cette fois-ci, vous appelez la méthode exec
sans rappel.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Ensuite, vous pouvez l'utiliser en faisant simplement:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
}).error(function(error){
console.log(error);
});
Comme souligné dans la section des commentaires de cette réponse, ces objets ne sont en réalité pas des promesses et doivent être pris en compte (voir Les requêtes ne sont pas des promesses ).
3. Utilisation de Mongoose Streams
Enfin, Mongoose prend également en charge les flux et les flux sont des émetteurs d'événements. Vous pouvez donc obtenir un flux puis vous abonner aux événements 'data' et 'error'. Comme ça:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
Ensuite, vous pouvez simplement faire:
var stream = getJedisStream('Anakin');
stream.on('data', function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
});
stream.on('error', function(error){
console.log(error);
});
Source , pour référence future.
il est exécuté avant l'affectation.
async function(req, res) {
var user;
await users.findOne({}, function(err,pro){
user=pro;
});
console.log(user); \\ it's define
});
Vous obtenez le résultat souhaité avec le code suivant. J'espère que cela vous aidera beaucoup ..
var async = require('async');
// custom imports
var User = require('../models/user');
var Article = require('../models/article');
var List1Objects = User.find({});
var List2Objects = Article.find({});
var resourcesStack = {
usersList: List1Objects.exec.bind(List1Objects),
articlesList: List2Objects.exec.bind(List2Objects),
};
async.parallel(resourcesStack, function (error, resultSet){
if (error) {
res.status(500).send(error);
return;
}
res.render('home', resultSet);
});