Подключения
Вы можете подключиться к MongoDB с помощью метода mongoose.connect().
mongoose.connect('mongodb://localhost/myapp');
Это минимально необходимое для подключения к базе данных myapp, работающей локально на стандартном порту (27017). Если локальное подключение не удается, попробуйте использовать 127.0.0.1 вместо localhost. Иногда проблемы могут возникать, если локальное имя хоста было изменено.
Вы также можете указать несколько дополнительных параметров в uri:
mongoose.connect('mongodb://username:password@host:port/database?options...');
Дополнительные сведения см. в спецификации строки подключения MongoDB.
Буферизация операций
Mongoose позволяет начать использование ваших моделей сразу, не дожидаясь установления подключения к MongoDB.
mongoose.connect('mongodb://localhost/myapp'); var MyModel = mongoose.model('Test', new Schema({ name: String })); // Works MyModel.findOne(function(error, result) { /* ... */ });
Это потому, что Mongoose буферизует вызовы функций модели внутри. Эта буферизация удобна, но также является распространённым источником путаницы. Mongoose по умолчанию не будет генерировать ошибки, если вы используете модель без подключения.
var MyModel = mongoose.model('Test', new Schema({ name: String })); // Will just hang until mongoose successfully connects MyModel.findOne(function(error, result) { /* ... */ }); setTimeout(function() { mongoose.connect('mongodb://localhost/myapp'); }, 60000);
Чтобы отключить буферизацию, выключите опцию bufferCommands в вашей схеме. Если у вас bufferCommands включено и ваше подключение зависло, попробуйте отключить bufferCommands, чтобы проверить, правильно ли вы открыли соединение.
Параметры
Метод connect также принимает объект options, который будет передан в основной драйвер MongoDB.
mongoose.connect(uri, options);
Полный список параметров можно найти в документации драйвера MongoDB Node.js для connect(), . Mongoose передает параметры драйверу без изменений, за исключением трёх исключений, объяснённых ниже.
-
useMongoClient- Это параметр, специфичный для mongoose (не передаётся в драйвер MongoDB), который активирует новую логику подключения mongoose 4.11. Если вы создаёте новое приложение, вы должны установить его в значениеtrue. -
user/pass- Имя пользователя и пароль для аутентификации. Эти параметры специфичны для mongoose, они эквивалентны параметрамauth.userиauth.passwordдрайвера MongoDB. -
autoIndex- По умолчанию Mongoose автоматически создаст индексы, определённые в вашей схеме, при подключении. Это отлично подходит для разработки, но не идеально для крупных производственных развертываний, поскольку построение индексов может снизить производительность. Если вы установитеautoIndexв значение false, Mongoose не будет автоматически создавать индексы для любой модели, связанной с этим подключением.
Ниже приведены некоторые параметры, которые важны для настройки mongoose.
-
autoReconnect- Встроенный драйвер MongoDB автоматически попытается восстановить подключение, когда потеряет соединение с MongoDB. Если вы не являетесь опытным пользователем, желающим управлять собственным пулом подключений, не устанавливайте этот параметр в значениеfalse. -
reconnectTries- Если вы подключены к одному серверу или прокси mongos (в отличие от реплики), драйвер MongoDB попытается восстановить подключение каждыеreconnectIntervalмиллисекунд в течениеreconnectTriesраз и после этого откажется. Когда драйвер отказывается, подключение mongoose генерирует событиеreconnectFailed. Этот параметр не работает для подключений к реплике. -
reconnectInterval- См.reconnectTries -
promiseLibrary- устанавливает библиотеку обещаний драйвера -
poolSize- Максимальное количество сокетов, которые драйвер MongoDB будет держать открытыми для этого подключения. По умолчаниюpoolSizeравно 5. Имейте в виду, что начиная с MongoDB 3.4, MongoDB разрешает только одну операцию на сокет за раз, поэтому вам может потребоваться увеличить это значение, если вы обнаружили, что несколько медленных запросов блокируют более быстрые запросы. -
bufferMaxEntries- Драйвер MongoDB также имеет собственный механизм буферизации, который срабатывает, когда драйвер отключён. Установите этот параметр в 0 и установитеbufferCommandsв значениеfalseв ваших схемах, если вы хотите, чтобы операции с базой данных немедленно завершались при отсутствии подключения драйвера, а не ожидали восстановления соединения.
Пример:
var options = { useMongoClient: true, autoIndex: false, // Don't build indexes reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect reconnectInterval: 500, // Reconnect every 500ms poolSize: 10, // Maintain up to 10 socket connections // If not connected, return errors immediately rather than waiting for reconnect bufferMaxEntries: 0 }; mongoose.connect(uri, options);
Обратный вызов
Функция connect() также принимает параметр обратного вызова и возвращает обещание.
mongoose.connect(uri, options, function(error) { // Check error in initial connection. There is no 2nd param to the callback. }); // Or using promises mongoose.connect(uri, options).then( () => { /** ready to use. The `mongoose.connect()` promise resolves to undefined. */ }, err => { /** handle initial connection error */ } );
Параметры строки подключения
Вы также можете указать параметры в строке подключения как параметры в строке запроса части URI.
mongoose.connect('mongodb://localhost:27017/test?connectTimeoutMS=1000', { useMongoClient: true }); // The above is equivalent to: mongoose.connect('mongodb://localhost:27017/test', { useMongoClient: true, connectTimeoutMS: 1000 });
Недостатком указания параметров в строке запроса является то, что параметры строки запроса сложнее читать. Преимущество состоит в том, что вам нужен только один параметр конфигурации — URI, а не отдельные параметры для socketTimeoutMS, connectTimeoutMS, и т. д. Лучшей практикой является размещение параметров, которые, вероятно, будут отличаться между разработкой и производством, таких как replicaSet или ssl, в строке подключения, а параметры, которые должны оставаться постоянными, такие как connectTimeoutMS или poolSize, в объекте параметров.
В документации MongoDB есть полный список поддерживаемых параметров строки подключения.
Примечание о keepAlive
Для приложений с длительным выполнением часто целесообразно включить keepAlive с количеством миллисекунд. Без него через некоторое время вы можете начать видеть ошибки "connection closed" по необъяснимым причинам. В таком случае, ознакомившись со этими материалами, вы можете решить включить keepAlive:
options.server.socketOptions = options.replset.socketOptions = { keepAlive: 120 };
mongoose.connect(uri, options);
Подключения к реплике
Для подключения к реплике вы передаёте список хостов, разделённых запятыми, для подключения, а не один хост.
mongoose.connect('mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]' [, options]);
Чтобы подключиться к реплике одного узла, укажите параметр replicaSet.
mongoose.connect('mongodb://host1:port1/?replicaSet=rsName');
Поддержка нескольких mongos
Поддерживается также высокая доступность по нескольким экземплярам mongos. Передайте строку подключения для ваших экземпляров mongos. Если вы не используете параметр useMongoClient, вы также должны установить параметр mongos:
mongoose.connect('mongodb://mongosA:27501,mongosB:27501', { mongos: true }, cb);
С useMongoClient, вам не нужно устанавливать параметр mongos. Вам также не нужно использовать mongos или useMongoClient в mongoose 5.x.
mongoose.connect('mongodb://mongosA:27501,mongosB:27501', { useMongoClient: true }, cb);
Множественные подключения
До сих пор мы видели, как подключиться к MongoDB с помощью стандартного подключения Mongoose. Иногда нам может потребоваться открыть несколько подключений к Mongo, каждое с различными параметрами чтения/записи или, возможно, к разным базам данных, например. В этих случаях мы можем использовать mongoose.createConnection(), которое принимает все обсуждаемые аргументы и возвращает для вас свежее соединение.
var conn = mongoose.createConnection('mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]', options);
Этот объект подключения затем используется для создания и получения моделей. Модели всегда связаны с одним подключением.
Пулы подключений
Каждый connection, созданный с mongoose.connect или mongoose.createConnection, поддерживается внутренним настраиваемым пулом подключений, по умолчанию с максимальным размером 5. Настройте размер пула, используя параметры подключения:
// single server var uri = 'mongodb://localhost/test'; mongoose.createConnection(uri, { server: { poolSize: 4 }}); // for a replica set mongoose.createConnection(uri, { replset: { poolSize: 4 }}); // passing the option in the URI works with single or replica sets var uri = 'mongodb://localhost/test?poolSize=4'; mongoose.createConnection(uri);
Параметр `useMongoClient`
Стандартная логика подключения Mongoose устарела начиная с версии 4.11.0. Пожалуйста, включите новую логику подключения с помощью параметра useMongoClient, но убедитесь, что вы протестировали свои подключения, если обновляете существующий код!
// Using `mongoose.connect`... var promise = mongoose.connect('mongodb://localhost/myapp', { useMongoClient: true, /* other options */ }); // Or `createConnection` var promise = mongoose.createConnection('mongodb://localhost/myapp', { useMongoClient: true, /* other options */ }); promise.then(function(db) { /* Use `db`, for instance `db.model()` }); // Or, if you already have a connection connection.openUri('mongodb://localhost/myapp', { /* options */ });
Параметры функции openUri() передаются прозрачно функции основного драйвера MongoDB MongoClient.connect(). Пожалуйста, ознакомьтесь с документацией драйвера по этой функции для получения параметров. То же самое относится к connect() и createConnection(), если useMongoClient является true.
Вы можете увидеть следующее предупреждение об устаревании с useMongoClient:
the server/replset/mongos options are deprecated, all their options are supported at the top level of the options object
В более старых версиях драйвера MongoDB вам приходилось указывать отдельные параметры для подключений к серверу, подключений к реплике и подключений mongos:
mongoose.connect(myUri, {
server: {
socketOptions: {
socketTimeoutMS: 0,
keepAlive: true
},
reconnectTries: 30
},
replset: {
socketOptions: {
socketTimeoutMS: 0,
keepAlive: true
},
reconnectTries: 30
},
mongos: {
socketOptions: {
socketTimeoutMS: 0,
keepAlive: true
},
reconnectTries: 30
}
});
С useMongoClient вы можете вместо этого объявить эти параметры на верхнем уровне без всех этих дополнительных вложений. Вот список всех поддерживаемых параметров.
// Equivalent to the above code mongoose.connect(myUri, { socketTimeoutMS: 0, keepAlive: true, reconnectTries: 30 });
Это устаревание происходит потому, что драйвер MongoDB устарел API, критически важный для логики подключения mongoose для поддержки MongoDB 3.6. См. этот выпуск github и этот блог-пост для получения дополнительной информации.
Далее
Теперь, когда мы рассмотрели connections, давайте посмотрим, как мы можем разделить части нашей функциональности на повторно используемые и делимые плагины.
© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/4.x/docs/connections.html