Както беше споменато в друг отговор, този код е асинхронен, не можете просто да върнете стойността, която искате, надолу по веригата от обратни извиквания (вложени функции). Трябва да разкриете някакъв интерфейс, който ви позволява да сигнализирате кода за повикване, след като получите желаната стойност (следователно, да ги извикате обратно или обратното повикване).
Има пример за обратно извикване, предоставен в друг отговор, но има алтернативна опция, която определено си струва да се проучи:обещания.
Вместо функция за обратно извикване, която извиквате с желаните резултати, модулът връща обещание, което може да влезе в две състояния, изпълнено или отхвърлено. Кодът за повикване изчаква обещанието да влезе в едно от тези две състояния, като съответната функция се извиква, когато го направи. Модулът задейства промяната на състоянието чрез resolve
ing или reject
инж. Както и да е, ето пример за използване на обещания:
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);
});
Сега, по-актуалните версии на драйвера node.js mongodb имат вградена поддръжка за обещания, не е нужно да вършите никаква работа, за да обвиете обратните извиквания в обещания като по-горе. Това е много по-добър пример, ако използвате актуален драйвер:
// 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);
});
Обещанията предоставят отличен метод за асинхронен контролен поток, силно препоръчвам да отделите известно време, за да се запознаете с тях.