web-dev-qa-db-fra.com

Renvoie les résultats mangouste dans la requête de recherche à une variable

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);
    };
});
22
Xanarus

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.

63
Edwin Dalorzo

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

});
5
Javad.mrz

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);
});
0
Surender Singh