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
});
Другие вопросы по тегам