Conforme mencionado em outra resposta, esse código é assíncrono, você não pode simplesmente retornar o valor desejado na cadeia de retornos de chamada (funções aninhadas). Você precisa expor alguma interface que permita sinalizar o código de chamada assim que tiver o valor desejado (portanto, chamando-os de volta ou callback).
Há um exemplo de retorno de chamada fornecido em outra resposta, mas há uma opção alternativa que definitivamente vale a pena explorar:promessas.
Em vez de uma função de retorno de chamada que você chama com os resultados desejados, o módulo retorna uma promessa que pode entrar em dois estados, cumprido ou rejeitado. O código de chamada aguarda a promessa de entrar em um desses dois estados, a função apropriada sendo chamada quando isso acontece. O módulo aciona a mudança de estado por
resolve
ing ou reject
ing. De qualquer forma, aqui está um exemplo usando promessas: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);
});
Agora, versões mais atualizadas do driver node.js mongodb têm suporte nativo para promessas, você não precisa fazer nenhum trabalho para envolver retornos de chamada em promessas como acima. Este é um exemplo muito melhor se você estiver usando um driver atualizado:
// 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);
});
Promessas fornecem um excelente método para fluxo de controle assíncrono, eu recomendo passar algum tempo se familiarizando com elas.