sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo exportar un objeto que solo está disponible en una devolución de llamada asíncrona?

La mejor opción, como sugerido en los comentarios por elclanrs , es exportar una promesa:

// 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();

(Estoy usando la increíble Q biblioteca aquí.)

A continuación se muestra la versión anterior de mi respuesta, dejada por el bien de la historia (pero si no desea usar promesas, en lugar de seguir ese camino, debe usar Respuesta de Matt ).

Su desventaja es que abrirá una conexión cada vez que require('database.js) (¡que fastidio!)

// 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(/* … */);
  });
});