Node.js и MongoDB, повторно используя объект DB

17

Я новичок в 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, но я не уверен, как даже получить объект DB в первую очередь, а затем как его повторно использовать.

Скажем, что у меня есть код Node.js выше в моем App.js, и у меня тогда есть разные маршруты, которым нужно выполнять разные операции на db:

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 , но из внешний вид этого ( Ссылка ), похоже, что я должен использовать MongoClient, а не дБ (). И я не уверен, что он решает мою проблему и ...

    
задан user2288749 14.06.2013 в 01:24
источник

2 ответа

36

Вы всегда можете написать модуль, который инициализирует подключения к базе данных и сделает их доступными во всей вашей программе. Например:

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);
  });
};

Я знаю, что люди говорят о пуле, но когда я делал бенчмаркинг объединения mongo-соединений по сравнению с единственным соединением для всех запросов, единственное соединение действительно выполнялось лучше. Конечно, это было около года назад, но я сомневаюсь, что базовая концепция изменилась. Все запросы являются асинхронными, поэтому для одновременных запросов не требуется несколько подключений.

Что касается MongoClient, я думаю, это новый синтаксис, который они обнадеживают. В любом случае, это, по сути, объект client , который вы хотите сохранить и сделать доступным независимо от того, какой стиль вы используете.

    
ответ дан Bret Copeland 14.06.2013 в 02:44
источник
3

Из вашего последнего фрагмента кода, похоже, вы используете 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
});
    
ответ дан floatdrop 08.08.2014 в 20:29
источник