Som nämnts i ett annat svar är den här koden asynkron, du kan inte bara returnera det värde du vill ha i kedjan av återuppringningar (kapslade funktioner). Du måste avslöja något gränssnitt som låter dig signalera anropskoden när du har det önskade värdet (därav ringa tillbaka dem eller ringa tillbaka).
Det finns ett exempel på återuppringning i ett annat svar, men det finns ett alternativ som definitivt är värt att utforska:löften.
Istället för en återuppringningsfunktion du anropar med önskat resultat, returnerar modulen ett löfte som kan gå in i två tillstånd, uppfyllt eller avvisat. Anropskoden väntar på löftet att gå in i ett av dessa två tillstånd, den lämpliga funktionen anropas när den gör det. Modulen utlöser tillståndsändringen genom resolve
ing eller reject
ing. Hur som helst, här är ett exempel med löften:
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);
});
Nu, mer uppdaterade versioner av node.js mongodb-drivrutinen har inbyggt stöd för löften, du behöver inte göra något arbete för att omsluta återuppringningar i löften som ovan. Detta är ett mycket bättre exempel om du använder en uppdaterad drivrutin:
// 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);
});
Löften är en utmärkt metod för asynkront kontrollflöde, jag rekommenderar starkt att du lägger lite tid på att bekanta dig med dem.