MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come esportare un oggetto che diventa disponibile solo in una richiamata asincrona?

L'opzione migliore, come suggerito nei commenti di elclanrs , è esportare una promessa:

// database.js
var MongoClient = require('mongodb').MongoClient,
    Q = require('q'),
    connect = Q.nbind(MongoClient.connect, MongoClient);

var promise = connect(/* url */);        

module.exports = {
  connect: function () {
    return promise;
  }
}

// app.js
var database = require('./database');

database.connect()
  .then(function (db) {
    app.get('/', function (req, res) {
      db.collection(/* … */);
    });
  })
  .catch(function (err) {
    console.log('Error connecting to DB:', err);
  })
  .done();

(Sto usando il fantastico Q libreria qui.)

Di seguito è riportata la vecchia versione della mia risposta, lasciata per motivi storici (ma se non vuoi usare le promesse, invece di seguire quella strada, dovresti usare Risposta di Matt ).

Il suo svantaggio è che aprirà una connessione ogni volta che require('database.js) (peccato!)

// DO NOT USE: left for the sake of history

// database.js
var MongoClient = require('mongodb').MongoClient;

function connect(cb) {
  MongoClient.connect(/* the URL */, cb);
}

module.exports = {
  connect: connect
}

// app.js
var database = require('./database');

database.connect(function (err, db) {
  app.get('/', function (req, res) {
      db.collection(/* … */);
  });
});