MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como exportar um objeto que só fica disponível em um callback assíncrono?


A melhor opção, como sugerido nos comentários por elclanrs , é exportar uma 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();

(Estou usando o incrível Q biblioteca aqui.)

Abaixo está a versão antiga da minha resposta, deixada por uma questão de história (mas se você não quiser usar promessas, em vez de seguir esse caminho, use Resposta de Matt ).

Sua desvantagem é que ele abrirá uma conexão toda vez que você require('database.js) (desapontamento!)
// 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(/* … */);
  });
});