MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment exporter un objet qui ne devient disponible que dans un rappel asynchrone ?

La meilleure option, car suggéré dans les commentaires par elclanrs , est d'exporter une promesse :

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

(J'utilise génial Q bibliothèque ici.)

Vous trouverez ci-dessous l'ancienne version de ma réponse, laissée pour l'histoire (mais si vous ne voulez pas utiliser de promesses, au lieu d'emprunter cette voie, vous devez utiliser Réponse de Matt ).

Son inconvénient est qu'il ouvrira une connexion chaque fois que vous require('database.js) (dommage !)

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