Использование mongoDB в Express-маршрутизаторах

Я просто изучаю, как использовать node / express и mongodb, и я немного запутался в объединении соединений.

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

var express = require('express'); var router = express.Router(); var config = require('../config.json'); var url = config.db.URI; var MongoClient = require('mongodb').MongoClient , assert = require('assert'); var db; // Connect to database router.all('*', function(req, res, next) { console.log('Connecting to db'); MongoClient.connect(url, function(err, database) { assert.equal(null, err); db = database; }); next(); }); // GET admin list page router.get('/', function(req, res, next) { res.render('lists/index'); var coll = db.collection('lists'); coll.find().each(function(err, obj) { console.log(obj); }); next(); }); router.get('/new', function(req, res, next) { res.render('lists/new'); next(); }); router.all('*', function(req, res, next) { console.log('Closing database'); //db.close(); }); module.exports = router; 

Я тестирую, как это представление взаимодействует с моей базой данных с двумя функциями router.all, которые переносят мои HTTP-запросы. На мой взгляд, в любое время, когда запрашивается страница в этом маршрутизаторе, сервер должен подключиться к базе данных, разрешить соответствующей функции HTTP-запроса обращаться к базе данных (в этом случае просто распечатывать ее содержимое на консоль), а затем закрыть ее потом как только запрос http будет выполнен. Однако, это не так. Как вы можете видеть, я прокомментировал функцию db.close, поскольку она выдает сообщение об ошибке «Невозможно установить заголовки после их отправки». Я предполагаю, что это означает, что я не совсем понимаю маршрут express-маршрута, и все не выполняется в том порядке, в котором я их ожидаю.

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

Я использую это как ссылку несколько на то, что является хорошей практикой в ​​отношении объединения, но они, похоже, не закрывают связь? Если я не закрываю соединение, я просто вижу, что число соединений mongodb растет, и я не думаю, что это хорошо. Это просто, что вам нужно найти баланс между количеством и длиной соединений?

Вы должны сделать свое соединение один раз и использовать его во всех обработчиках.

Прямо сейчас, что вы делаете, происходит повторное подключение к базе данных по каждому отдельному запросу, даже по тем запросам, которые вообще не используют базу данных. Кроме того, вы вызываете next (), прежде чем дожидаетесь установления соединения.

Подключения к базам данных должны быть постоянными – не одноразовые вещи, поэтому вы, вероятно, получите очень низкую производительность с вашим подходом, и я даже не уверен, почему вы хотите это сделать. У вас были проблемы с одним соединением? Я не думаю, что вам удастся забивать вашу базу данных. Во всяком случае, это может только ухудшить ситуацию.

Когда вы подключаетесь к Mongo с родным драйвером MongoDB Node.js, есть несколько вариантов, которые вы можете использовать, например:

  • poolSize – установить максимальный пул для каждого отдельного сервера или прокси-соединения (по умолчанию 5 )
  • autoReconnect – повторное подключение к ошибке (по умолчанию это true )

Некоторые другие интересные варианты: reconnectTries , reconnectInterval , keepAlive , connectTimeoutMS , socketTimeoutMS .

Вы можете изменить значения этих параметров, если вас не устраивают значения по умолчанию.

Для получения дополнительной информации см .:

  • Ошибки подключения и повторные попытки
  • MongoClient или как подключиться новым и лучшим способом
  • Учебники / Подключиться к MongoDB
  • Ссылки / Параметры подключения / Настройки подключения
  • Вопрос о автодозвонщике node.js mongo (список рассылки)