Domanda

Devo restituire i risultati di una query con mongoose in node.js.

Come si restituisce il valore per impostare il valore su una variabile?

Quello che devo fare è:

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

In modo da avere:

results = docs 

Grazie mille per la tua risposta.

Ho anche un altro problema.

Come passare la variabile in un operatore di query con find o findOne?Come :

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);
    };
});
È stato utile?

Soluzione

Esistono diversi modi per ottenere ciò che desideri.

1.Utilizzo delle query Mongoose

In questa strategia, la tua funzione restituisce una query Mongoose che puoi utilizzare in seguito per invocare il metodo exec e usarlo per ottenere i risultati.

function getJedisQuery(name){
   var query = Jedi.find({name:name});
   return query;
}

Quindi puoi usarlo semplicemente facendo:

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.Utilizzo di oggetti simili a Mongoose Promise

Moogose fornisce supporto per oggetti simili a promesse.Tutto quello che devi fare è qualcosa di simile a quello che ho fatto sopra, ma questa volta invochi il file exec metodo senza callback.

function getJedisPromise(name){
   var promise = Jedi.find({name:name}).exec();
   return promise;
}

Quindi puoi usarlo semplicemente facendo:

var promise = getJedisPromise('Luke');
promise.then(function(jedis){
   jedis.forEach(function(jedi){
      console.log(jedi.name);
   });
})

Come evidenziato nella sezione commenti di questa risposta, questi oggetti non sono in realtà promesse e ciò deve essere preso in considerazione (vedi Le domande non sono promesse).

3.Utilizzo dei flussi di mangusta

Infine, Mongoose ha anche il supporto per i flussi e i flussi sono emettitori di eventi.Quindi, potresti ottenere uno streaming e quindi iscriverti per eventi "dati" ed "errore".Come questo:

function getjedisStream(name){
   var stream = Jedi.find({name:name}).stream();
   return stream;
}

Quindi puoi semplicemente fare:

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

Fonte, per riferimento futuro.

Altri suggerimenti

viene eseguito prima dell'assegnazione.

 async function(req, res) {
      var user;
      await users.findOne({}, function(err,pro){
          user=pro;
        });
      console.log(user); \\ it's define
    };
.

ottieni il risultato desiderato dal seguente codice.Spero che questo ti aiuterà molto ..

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);
});
.

Puoi facilmente raggiungere questo problema.

    const getUser = async ( req, res ) => {
        let users = () => ( User.find({_id : users_list[i]['user_id']},{email : 1, credits : 1}).exec() );
        try {  res.send({"user":await users() });}
        catch(e) { console.log(e) }
    }    
    app.get('/user' , getUser);
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top