2016-01-26 2 views
0

Я знаю, что этот вопрос уже задан более чем пару раз, но я не могу найти ответ на свой конкретный вопрос.Как обрабатывать соединение MongoDB и запросы в ExpressJS

Я создал пример приложения с express-generator, и я создал модуль со всеми параметрами соединения.

/helpers/db.js

var MongoClient = require('mongodb').MongoClient; 
var ObjectId = require('mongodb').ObjectID; 
var url = 'mongodb://localhost:27017/piva'; 
var db; 

var database = { 
    connect: function(){ 
     MongoClient.connect(url, function(err, database) { 
      if(err) throw 'MongoDB connection error: ' + err; 
      console.log('connesso al db'); 
      db = database; 
     }); 
    }, 
    useDb: function(){ 
     return db; 
    } 
} 

module.exports = database; 

Если я позвоню в главном app.js файле require('./helpers/db').connect() и я требую модуля в одном из моих маршрутов с использованием

/routes/index.js

var db = require('../helpers/db').useDb(); 
router.get('/', function (req, res, next) { 
    db.collection('test').... 
    index.render({ 
    title: 'Home page' 
    }, res); 
}); 

он не работает, так как db возвращает undefined, а если я требую его внутри router.get, он работает. Я думаю, что я должен начать подключение до загрузки приложения, но я не знаю, как с этим справиться.

Я видел много Tuts или ответа, где они говорят, чтобы позвонить app.listen(3000); с обратным вызовом после Mongoclient.connect() подключился к БД, но я не знаю, как это сделать, так как мое приложение было создано с express-generator.

+0

Вы должны взглянуть на точку входа вашего приложения. Экспресс-генератор помещает его в /bin/www.js. Вы найдете вызов 'listen()' там и можете связать его с обратным вызовом 'connect()'. – PeterVC

+0

Я завернул все следующее в 'connect()' callback' server = http.createServer (app); server.listen (порт); server.on ('error', onError); server.on («прослушивание», onListening); «но все равно не работает ... что мне не хватает? Если я 'console.log (db)' сразу после 'require' на странице' index.js', я все еще получаю 'undefined' ... – crash

+0

Как вы передаете ссылку на 'db' из обратного вызова? Мне нужно посмотреть, что вы сделали на www. – PeterVC

ответ

0

Измените свой файл подключения следующим образом и вызовите форму функции init.js. Он сгенерирует объект db, а затем вызовет его из любой точки.

var MongoClient = require('mongodb').MongoClient; 
var ObjectId = require('mongodb').ObjectID; 
var url = 'mongodb://localhost:27017/piva'; 
module.exports.init = function(callback){ 
MongoClient.connect(url, function(err, db){ 
    if(!err){ 
     console.log('mongodb connected'); 
    } 
    module.exports.db = db; 
    callback(err); 
}); 
}; 
+0

Это не работает для меня ... Я сделал это и потребовал его даже до маршрутов в файле' app.js', но когда я вызываю 'require ('../ helpers/db'), .db' из любого маршрута, который он по-прежнему возвращает 'undefined' – crash

+0

, вы можете подключиться к db ?? – user2178244

+0

Да, он подключается к БД, но это происходит после того, как переменная db вызывается в маршрутах, поэтому она возвращает 'undefined'. Я думаю, что я должен запустить базу данных, прежде чем запускать приложение, как говорит PeterVC, но я не могу справиться с этой работой ... – crash

Смежные вопросы