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
источник
  • Хм, вам придется читать модули и прочее, прежде чем пытаться. «module.exports.init» выглядит странно для меня :) Но вы говорите, что код в «app.js» должен запускаться только один раз, а затем код в «randomFile.js» - тот, который я использую в моем app.post ('/ employee')? Будучи в первый раз, у меня есть все в одном файле App.js. –  user2288749 14.06.2013 в 08:05
  • Правильно, функция init должна вызываться только один раз. RandomFile.js был просто примером, показывающим, что вы можете использовать инициализированную базу данных из любого места в коде. Я мог бы так же легко использовать в app.js. Вы определенно должны понимать, как работают модули, если вы собираетесь работать с узлом, но это действительно не сложно. –  Bret Copeland♦ 14.06.2013 в 10:36
  • Большое спасибо за ваше время и усилия, я получил его сегодня! Когда я запускаю сервер, я сразу получаю 5 подключений к БД .. Это плохо? (Guessing 5, так как это разрешенные соединения по умолчанию?) Я изменил вызов init и как я использую модуль, см. Pastebin.com/QFdZY51F –  user2288749 15.06.2013 в 02:53
  • Я не уверен, почему вы предполагаете пять подключений. Это должно быть только одно –  Bret Copeland♦ 15.06.2013 в 05:13
  • Похоже, что драйвер mongodb автоматически выполняет некоторые пулы соединений. Вот почему есть 5 подключений, и то, что делает MongoClient.connect (), создает пул соединений. –  Serhat Ozgel 08.09.2013 в 22:13
Показать остальные комментарии
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
источник