Wie in einer anderen Antwort erwähnt, ist dieser Code asynchron, Sie können den gewünschten Wert nicht einfach in der Kette der Rückrufe (verschachtelte Funktionen) zurückgeben. Sie müssen eine Schnittstelle bereitstellen, mit der Sie den aufrufenden Code signalisieren können, sobald Sie den gewünschten Wert haben (daher Rückruf oder Callback).
Es gibt ein Rückrufbeispiel in einer anderen Antwort, aber es gibt eine alternative Option, die es definitiv wert ist, erkundet zu werden:Versprechungen.
Anstelle einer Callback-Funktion, die Sie mit den gewünschten Ergebnissen aufrufen, gibt das Modul ein Promise zurück, das zwei Zustände annehmen kann, erfüllt oder abgelehnt. Der aufrufende Code wartet auf das Versprechen, in einen dieser beiden Zustände einzutreten, wobei die entsprechende Funktion aufgerufen wird, wenn dies der Fall ist. Das Modul löst den Zustandswechsel durch resolve
aus oder reject
ing. Wie auch immer, hier ist ein Beispiel mit Promises:
Db1.js:
// db1.js
var MongoClient = require('mongodb').MongoClient;
/*
node.js has native support for promises in recent versions.
If you are using an older version there are several libraries available:
bluebird, rsvp, Q. I'll use rsvp here as I'm familiar with it.
*/
var Promise = require('rsvp').Promise;
module.exports = {
FindinCol1: function() {
return new Promise(function(resolve, reject) {
MongoClient.connect('mongodb://localhost:27017/db1', function(err, db) {
if (err) {
reject(err);
} else {
resolve(db);
}
}
}).then(function(db) {
return new Promise(function(resolve, reject) {
var collection = db.collection('col1');
collection.find().toArray(function(err, items) {
if (err) {
reject(err);
} else {
console.log(items);
resolve(items);
}
});
});
});
}
};
// app.js
var db = require('./db1');
db.FindinCol1().then(function(items) {
console.info('The promise was fulfilled with items!', items);
}, function(err) {
console.error('The promise was rejected', err, err.stack);
});
Jetzt haben aktuellere Versionen des mongodb-Treibers von node.js native Unterstützung für Zusagen, Sie müssen keine Arbeit leisten, um Rückrufe wie oben in Zusagen zu verpacken. Dies ist ein viel besseres Beispiel, wenn Sie einen aktuellen Treiber verwenden:
// db1.js
var MongoClient = require('mongodb').MongoClient;
module.exports = {
FindinCol1: function() {
return MongoClient.connect('mongodb://localhost:27017/db1').then(function(db) {
var collection = db.collection('col1');
return collection.find().toArray();
}).then(function(items) {
console.log(items);
return items;
});
}
};
// app.js
var db = require('./db1');
db.FindinCol1().then(function(items) {
console.info('The promise was fulfilled with items!', items);
}, function(err) {
console.error('The promise was rejected', err, err.stack);
});
Promises stellen eine ausgezeichnete Methode für asynchronen Kontrollfluss dar, ich empfehle dringend, etwas Zeit damit zu verbringen, sich mit ihnen vertraut zu machen.