Retourner les résultats mongoose dans find query vers une variable
je dois retourner les résultats d'une requête avec mongoose dans le noeud.js.
Comment retourner la valeur pour la définir à 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;
};
});
afin d'avoir:
results = docs
Merci beaucoup pour votre réponse .
j'ai aussi un autre problème.
Comment passer une 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);
};
});
3 réponses
Il y a plusieurs façons d'obtenir ce que vous voulez.
1. À L'Aide De La Mangouste Requêtes
Dans cette stratégie, votre fonction retourne une Mangouste requête que vous pourrez ensuite utiliser pour invoquer 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. À L'Aide De La Mangouste Promesses
Moogose soutient les promesses. Tout ce que vous avez à faire est de quelque chose de semblable à ce que j'ai fait ci-dessus, mais cette fois, vous invoquez le exec
méthode sans rappel.
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
Ensuite, vous pouvez l'utiliser simplement en faisant:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
}).error(function(error){
console.log(error);
});
3. Utilisation Des Flux De Mangouste
enfin, Mongoose supporte aussi les flux et les flux sont des émetteurs d'événements. Ainsi, vous pouvez obtenir un flux puis vous abonner aux événements 'data' et 'error'. Comme ceci:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
alors 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 la mission.
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 désiré par le code suivant. Espérons que cela vous aide 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);
});