MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie exportiere ich ein Objekt, das nur in einem asynchronen Callback verfügbar wird?

Die beste Option, da in den Kommentaren vorgeschlagen von elclanrs , soll ein Versprechen exportieren:

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

(Ich verwende das großartige Q Bibliothek hier.)

Unten ist die alte Version meiner Antwort, die aus Gründen der Geschichte hinterlassen wurde (aber wenn Sie keine Versprechen verwenden möchten, sollten Sie anstelle dieses Weges Matts Antwort ).

Der Nachteil ist, dass jedes Mal, wenn Sie require('database.js) eine Verbindung öffnen, eine Verbindung hergestellt wird (Schmerz!)

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