Node.js и MongoDB, повторно использующие объект БД
Я новичок в Node.js и MongoDB, но мне удалось собрать некоторые части из SO и документации для mongo.
Монго документация приводит пример:
// Retrieve
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
if(!err) {
console.log("We are connected");
}
});
Что выглядит хорошо, если мне нужно только использовать БД в одной функции в одном месте. Поиск и чтение в SO показали мне, что мне не следует каждый раз открывать новое соединение, а использовать пул и повторно использовать объект базы данных, который я получаю в первый раз. Этот ответ широко распространен в SO, но я не уверен, как вообще получить объект БД, а затем как использовать его повторно.
Скажем, у меня есть код Node.js выше в моем App.js, и тогда у меня есть разные маршруты, которые должны запускать различные операции на БД, например:
app.post('/employee', function(req, res){
//Put req.name in database
});
app.post('/car', function(req, res){
//Put req.car in database
});
Как мне собрать эти два фрагмента во что-нибудь полезное?
Я нашел похожий вопрос в Node.js для повторного использования ссылки на MongoDB, но, судя по всему ( http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html), похоже, я должен использовать MongoClient, а не db(). И я не уверен, что это решит и мою проблему...
2 ответа
Вы всегда можете написать модуль, который инициализирует ваши соединения с базой данных и делает их доступными для всей вашей программы. Например:
mongo.js
var mongodb = require('mongodb');
module.exports.init = function (callback) {
var server = new mongodb.Server("127.0.0.1", 27017, {});
new mongodb.Db('test', server, {w: 1}).open(function (error, client) {
//export the client and maybe some collections as a shortcut
module.exports.client = client;
module.exports.myCollection = new mongodb.Collection(client, 'myCollection');
callback(error);
});
};
app.js
var mongo = require('./mongo.js');
//setup express...
//initialize the db connection
mongo.init(function (error) {
if (error)
throw error;
app.listen(80); //database is initialized, ready to listen for connections
});
randomFile.js
var mongo = require('./mongo.js');
module.exports.doInsert = function () {
//use the collection object exported by mongo.js
mongo.myCollection.insert({test: 'obj'}, {safe:true}, function(err, objects) {
if (err)
console.warn(err.message);
});
};
Я знаю, что люди говорят о пуле, но когда я провел сравнительный анализ пулов монго-соединений по сравнению с одним соединением для всех запросов, одно соединение действительно работало лучше. Конечно, это было около года назад, но я сомневаюсь, что основная концепция изменилась. Все запросы являются асинхронными, поэтому для одновременных запросов не обязательно использовать несколько соединений.
Что касается MongoClient, я думаю, что это новый синтаксис, который они поддерживают. В любом случае, это по сути клиентский объект, который вы хотите сохранить и сделать доступным независимо от того, какой стиль вы используете.
Судя по вашему последнему фрагменту кода, вы используете Express или похожую среду. Вы можете использовать express-mongo-db, чтобы получить соединение внутри req
объект. Это промежуточное ПО будет кешировать соединение для вас и делиться им с другими входящими запросами:
app.use(require('express-mongo-db')(require('mongodb'), { db: 'test' }))
app.post('/employee', function(req, res){
// req.db.collection('names'),insert(req.name)
// Put req.name in database
});
app.post('/car', function(req, res){
// req.db.collection('names').insert(req.name)
// Put req.car in database
});