В коде:
// db.js
require('mongodb').MongoClient.connect(/* the URL */, function (err, db) {
module.exports = db;
});
// app.js
var db = require('./db');
app.get('/', function (req, res) {
db.collection(/* … */); // throws error
});
Вы называли connect
в db.js
классе, но это асинхронно.
Вызов в app.js
к require
синхронно в поведении, хотя, так что он всегда получит неопределенное значение (как exports
не будет присвоено значение в то время db.js
закончил выполнение).
Я предлагаю держать вещи простыми.
Опция, которую я обычно использую, - это то, где код приложения делает соединение и не запускает прослушивание HTTP-соединений до тех пор, пока он не будет завершен. Затем я инициализирую каждый файл route
, вызвав именованный метод и передав ему соединение с базой данных.
Или вы всегда можете вызвать соединение в каждом модуле, но кешируйте значение. (Вызов вызова должен быть вызван в коде обратного вызова маршрута, чтобы маршруты были определены сразу, а не когда соединение было фактически установлено).
// db.js
var _db = null;
exports = function(callback) {
if (!_db) {
_db = {}; // only one connection, so we'll stop others from trying
require('mongodb').MongoClient.connect(/* the URL */, function (err, db) {
_db = db;
callback(err, db);
});
} else {
callback(null, _db);
}
};
// app.js
var db = require('./db');
db(function(err, connection) {
// store the connection value here and pass around, or ...
// call this always in each file ...
});
/// or ...
app.get('/', function (req, res) {
db(function(err, connection) {
connection.collection(/* … */);
});
});
Или, вы можете использовать MongooseJS (обертку для родного драйвера NodeJS MongoDB), где команда, и т.д. находится в очереди, если соединение не доступно ....
Как насчет экспорта, как ' экспорт = требуется ('') MongoDB MongoClient.connect;. '. Затем выполните запрос и сделайте что-нибудь внутри обратного вызова? – elclanrs
На первый взгляд кажется, что это должно сработать. Что вы видите, если вы выполните console.log (db) после var db = require ('./db') и внутри обратного вызова app.get? И вы попробовали console.log (db) внутри обратного вызова connect db.js? –
@elclanrs Извините, я не следую. –