2017-02-22 10 views
0

Учитывая следующий app.js код:Упорно соединение MongoDB во все node.js маршрутизаторе модулей

var express = require('express'); 
 
var app = express(); 
 
var mongodb = require('mongodb'); 
 

 
var db = null; 
 

 
mongodb.MongoClient.connect('mongodb://localhost/mysite', function(err, database) { 
 
    if(err) throw err; 
 
    
 
    db = database; 
 

 
    app.listen(3000); 
 
    console.log('Listening on port 3000'); 
 
}); 
 

 
var outside = require('./outside'); 
 
app.use('/outside', outside); 
 

 
app.get('/inside', function(req, res) { 
 
    collection = db.collection('pages'); 
 
    collection.find({}, function(err, data) { 
 
     if(data) { 
 
      res.send('inside worked'); 
 
     }else { 
 
      console.log('oops'); 
 
     } 
 
    }); 
 
});

и outside.js код следующим образом:

var express = require('express'); 
 
var router = express.Router(); 
 

 
router.get('/', function(req, res) { 
 
    collection = db.collection('pages'); 
 
    collection.find({}, function(err, data) { 
 
     if(data) { 
 
      res.send('outside worked'); 
 
     }else { 
 
      console.log('oops'); 
 
     } 
 
    }); 
 
}); 
 

 
module.exports = router;

, если я использую «var db = null», как показано на рисунке, он является локальным для приложения, и когда внутренний маршрут работает, он доступен для него, но он недоступен для внешнего маршрута.

Если я использую «db = null», что делает его глобальным, он доступен для обоих маршрутов. Я не уверен, что это правильный/самый элегантный способ сделать это. Если да, дайте мне знать, в противном случае дайте мне знать лучший способ, принимая во внимание, что я не хочу каждый раз создавать новое соединение, и я хочу использовать пулы, как указано в других подобных сообщениях здесь.

За комментарием на другой аналогичной должности, я изменил строку в app.js:

дб = базы данных; - db = database; app.locals.db = database;

и добавил строку outside.js:

var db = req.app.locals.db; 

так что теперь гласит: вар дБ = req.app.locals.db; collection = db.collection ('pages');

Это действительно работает, но, как упоминалось в другом сообщении, я не уверен, что это повторное использование соединения или открытие нового или если оно правильно использует пулы подключений.

ответ

0

То, что я сделал в проекте было следующее:

Отдельную соединение в отдельном файле JS называется «INIT-mongoose.js»

const connection = mongoose.connect("mongoURL") 
module.exports = connection 

-Require соединение всякий раз, когда я хочу использовать его

const connection = include('libs/init-mongoose.js') 

одним из преимуществ этой модели является то, что если вам нужно, чтобы закрыть соединение в одной части кода, все части кода, разделяющие это соединение будет иметь его рядом д. В моем случае я бегу несколько nodejs Batch-скриптов с помощью одного вызова и необходимо, чтобы закрыть соединение в последнем сценарии

Надеюсь, мой ответ был полезным

+0

Спасибо. Использует ли это существующее соединение и пул соединений в приложении или открывает новое соединение каждый раз, когда он используется? –

+0

Он использовал соединение во всем приложении. Если бы мой ответ был полезен, пожалуйста, примите/повысьте;) –

+0

Спасибо Израилю. Я поддержал ваш ответ. Я новичок в этом, так что нормально ждать некоторых комментариев от других, которые более осведомлены, чем я, говоря, что это лучший ответ, прежде чем я принимаю это? –

0

вы также можете сделать это, не требуя подключения в каждом файле. Храните переменные соединения в глобальной

global.connection = mongodb.MongoClient.connect('mongodb://localhost/mysite',function(err,database) { 
    if(err) throw err; 

    db = database; 

    app.listen(3000); 
    console.log('Listening on port 3000'); 
}); 

, а затем вы можете использовать его

router.get('/', function(req, res) { 
    global['collection'] = db.collection('pages'); 
    global['collection'].find({}, function(err, data) { 
     if(data) { 
      res.send('outside worked'); 
     }else { 
      console.log('oops'); 
     } 
    }); 
}); 
+0

Спасибо Ashish. Это похоже на то, что я упомянул в своем сообщении об использовании глобальной переменной vs local. Есть ли недостатки в использовании глобальной переменной? –

+0

Да могут быть некоторые недостатки. В этом решении эта переменная соединения всегда будет жить и займет место в вашем блоке памяти, если вы перезапустите приложение. Таким образом, хранение небольших значений или данных не будет сильно влиять, но хранение большого набора данных приведет к сокращению объема памяти вашего компьютера. –