webentwicklung-frage-antwort-db.com.de

Gibt die Ergebnismenge in der Suchabfrage an eine Variable zurück

Ich muss die Ergebnisse einer Abfrage mit mongoose in node.js zurückgeben.

Wie geben Sie den Wert zurück, um den Wert auf eine Variable zu setzen?

Was ich tun muss, ist: 

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

Um zu haben:

results = docs 

Vielen Dank für Ihre Antwort.

Ich habe auch ein anderes Problem.

Wie übergeben Sie Variablen in einem Abfrageoperator mit find oder findOne? Mögen : 

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

Es gibt mehrere Möglichkeiten, das zu erreichen, was Sie möchten. 

1. Verwenden von Mongoose-Abfragen

In dieser Strategie gibt Ihre Funktion eine Mongoose-Abfrage zurück, die Sie später verwenden können, um die Methode exec aufzurufen und sie zum Abrufen der Ergebnisse zu verwenden.

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

Dann können Sie es einfach verwenden:

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. Mongoose Versprechenähnliche Objekte verwenden

Moogose bietet Unterstützung für objektähnliche Objekte. Alles, was Sie tun müssen, ist etwas, das dem, was ich oben gemacht habe, ähnlich ist, aber dieses Mal rufen Sie die Methode exec ohne Rückruf auf.

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

Dann können Sie es verwenden, indem Sie einfach Folgendes tun:

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

Wie im Kommentarabschnitt dieser Antwort hervorgehoben, handelt es sich bei diesen Objekten nicht um Versprechungen, und dies muss berücksichtigt werden (siehe Abfragen sind keine Versprechen ).

3. Mongoose Streams verwenden

Schließlich unterstützt Mongoose auch Streams und Streams sind Event-Emitter. Sie könnten also einen Stream abrufen und dann Ereignisse für "Daten" und "Fehler" abonnieren. So was:

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

Dann können Sie einfach folgendes tun:

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

Quelle , zur zukünftigen Referenz.

63
Edwin Dalorzo

es wird vor der Zuweisung ausgeführt.

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

});
5
Javad.mrz

Das gewünschte Ergebnis erzielen Sie durch folgenden Code. Hoffe das hilft dir sehr ..

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