node.js mongodb javascript scope confusion

Sto sviluppando un’applicazione express.js, senza mangusta.

Quello che sto cercando di fare è incapsulare le chiamate a mongodb all’interno di una funzione, passare la funzione a qualche parametro e recuperare i dati da mongodb.

Il problema che sto incontrando è spiegato dal codice qui sotto

function get_data() { var mongo = require('mongodb'),Server = mongo.Server,Db = mongo.Db; var server = new Server('localhost', 27017, {auto_reconnect: true}); var db = new Db('test', server); db.collection('test_collection', function(err, collection) { collection.find().toArray(function(err, items) { var data = items; }); }); console.log(data); console.log("in get"); return data; } 

Come restituisco gli oggetti Matrice che ho estratto da mongo db da questa funzione.

Voglio sapere come funziona lo scoping in javascript e come posso inserire gli elementi in una variabile e restituirli dalla funzione get_data.

Dopo la risposta

Ho risolto il codice. Ora funziona e sembra così.

 function get_data(callback) { var mongo = require('mongodb'),Server = mongo.Server,Db = mongo.Db; var server = new Server('localhost', 27017, {auto_reconnect: true}); var db = new Db('test', server); db.open(function(err, db) { if (err) return callback(err); db.collection('test_collection', function(err, collection) { if (err) return callback(err); collection.find().toArray(callback); }); }); } get_data(function(err, items) { // handle error console.log(items); }); 

Poiché gli oggetti vengono recuperati da MongoDB in modo asincrono, la funzione get_data deve accettare un callback che verrà utilizzato per restituire i risultati. Credo che avrai anche bisogno di open esplicitamente la connessione al database.

 function get_data(callback) { ... db.open(function(err, db) { if (err) return callback(err); db.collection('test_collection', function(err, collection) { if (err) return callback(err); collection.find().toArray(callback); }); }); } get_data(function(err, items) { // handle error console.log(items); });