Ответ 1
как подключиться к базе данных?
Чтобы подключиться с помощью встроенного драйвера MongoDB, вам нужно сделать что-то вроде следующего:
var util = require('util');
var mongodb = require('mongodb');
var client = mongodb.MongoClient;
var auth = {
user: 'username',
pass: 'password',
host: 'hostname',
port: 1337,
name: 'databaseName'
};
var uri = util.format('mongodb://%s:%[email protected]%s:%d/%s',
auth.user, auth.pass, auth.host, auth.port, auth.name);
/** Connect to the Mongo database at the URI using the client */
client.connect(uri, { auto_reconnect: true }, function (err, database) {
if (err) throw err;
else if (!database) console.log('Unknown error connecting to database');
else {
console.log('Connected to MongoDB database server at:');
console.log('\n\t%s\n', uri);
// Create or access collections, etc here using the database object
}
});
Базовое соединение настроено так. Это все, что я могу дать вам, просто базовое описание того, что вы хотите. Опубликуйте код, который у вас есть, чтобы получить более конкретную помощь.
Должен ли я создать соединение в каждом из этих файлов и использовать их?
Нет.
Итак, как мне создать единственный пул подключений и использовать его во всех файлах collections.js?
Вы можете создать один файл с кодом, подобным приведенному выше, и позвоните ему dbmanager.js
, соединяющемуся с базой данных. Экспортируйте функции, такие как createUser
, deleteUser
и т.д., Которые работают с вашей базой данных, а затем экспортируют такие функции:
module.exports = {
createUser: function () { ; },
deleteUser: function () { ; }
};
который вы могли бы затем require
из другого файла:
var dbman = require('./dbmanager');
dbman.createUser(userData); // using connection established in `dbmanager.js`
EDIT:. Поскольку мы имеем дело с JavaScript и одним потоком, собственный драйвер действительно автоматически обрабатывает пул соединений. Вы можете найти это в ссылках StackOverflow ниже, чтобы получить больше подтверждения. ОП указывает это и в вопросе. Это означает, что client.connect
следует вызывать только один экземпляр вашего сервера. После того, как объект database
будет успешно извлечен из вызова client.connect
, этот объект database
должен быть повторно использован во всем экземпляре вашего приложения. Это легко осуществить, используя шаблон модуля, который Node.JS обеспечивает.
Мое предложение - создать модуль или набор модулей, которые служат одной точкой контакта для взаимодействия с базой данных. В моих приложениях у меня обычно есть один модуль, который зависит от собственного драйвера, вызывающего require('mongodb')
. Все остальные модули в моем приложении не будут напрямую обращаться к базе данных, но вместо этого все манипуляции должны координироваться этим модулем базы данных.
Это инкапсулирует весь код, связанный с собственным драйвером, в один модуль или набор модулей. Кажется, что OP думает, что есть проблема с простым примером кода, который я опубликовал, описывая проблему с "одним большим закрытием" в моем примере. Это все довольно простые вещи, поэтому я добавляю разъяснения относительно базовой архитектуры здесь, но я все еще не чувствую необходимости изменять какой-либо код.
OP также, похоже, думает, что здесь можно сделать несколько соединений. Это невозможно с этой настройкой. Если вы создали модуль, как я предлагаю выше, то при первом вызове require('./dbmanager')
он выполнит код в файле dbmanager.js
и вернет объект module.exports
. Объект экспорта кэшируется и также возвращается при каждом последующем вызове require('./dbmanager')
, однако код в dbmanager.js
будет выполнен только с первым require
.
Если вы не хотите создавать такой модуль, то другим вариантом будет экспортировать только database
, переданный на обратный вызов для client.connect
, и использовать его непосредственно в разных местах вашего приложения. Однако я рекомендую против этого, независимо от проблем с OP.
Аналогичные, возможно дублирующие вопросы Stackoverflow, среди прочих: