Я читал и читал и до сих пор не понимаю, как лучше всего использовать одно и то же соединение с базой данных (MongoDb) во всем приложении NodeJs. Насколько я понимаю, соединение должно быть открыто при запуске приложения и повторно использоваться между модулями. Моя текущая идея наилучшего способа состоит в том, что server.js
(главный файл, где все начинается) подключается к базе данных и создает объектную переменную, которая передается модулям. После подключения эта переменная будет использоваться кодом модулей по мере необходимости, и это соединение останется открытым. Например:
var MongoClient = require('mongodb').MongoClient;
var mongo = {}; // this is passed to modules and code
MongoClient.connect("mongodb://localhost:27017/marankings", function(err, db) {
if (!err) {
console.log("We are connected");
// these tables will be passed to modules as part of mongo object
mongo.dbUsers = db.collection("users");
mongo.dbDisciplines = db.collection("disciplines");
console.log("aaa " + users.getAll()); // displays object and this can be used from inside modules
} else
console.log(err);
});
var users = new(require("./models/user"))(app, mongo);
console.log("bbb " + users.getAll()); // not connected at the very first time so displays undefined
то другой модуль models/user
выглядит так:
Users = function(app, mongo) {
Users.prototype.addUser = function() {
console.log("add user");
}
Users.prototype.getAll = function() {
return "all users " + mongo.dbUsers;
}
}
module.exports = Users;
Теперь у меня ужасное чувство, что это неправильно, есть ли какие-то очевидные проблемы с этим подходом, и если да, то как сделать его лучше?
источник
module.exports = mongoist(connectionString);
. (Читайте об этомconnectionString
в Руководстве по MongoDB.)Ответы:
Вы можете создать
mongoUtil.js
модуль, который имеет функции как для подключения к mongo, так и для возврата экземпляра mongo db:Чтобы использовать его, вы должны сделать это в своем
app.js
:А затем, когда вам понадобится доступ к mongo где-то еще, например, в другом
.js
файле, вы можете сделать это:Причина, по которой это работает, заключается в том, что в узле, когда модули имеют значение
require
d, они загружаются / загружаются только один раз, поэтому вы всегда будете иметь только один экземпляр_db
иmongoUtil.getDb()
всегда будете возвращать тот же экземпляр.Обратите внимание, код не тестировался.
источник
app.js
функцию обратного вызоваconnectToServer
. Если выrequire
ихapp.js
ранее_db
установили, вы получите неопределенные ошибки в других модулях.var database = mongoUtil.getDb(); database.db().collection( 'users' )
.Есть много способов, которыми это можно настроить, чтобы принимать объекты конфигурации в разных местах, но в целом это похоже на то, как у вас выложен ваш код, хотя и с более современным синтаксисом JS. Может быть легко переписан на прототипы и обратные вызовы, если это ваше требование.
mongo.js
Users.js
app.js
someFile.js
источник
Вот как я это делаю с современным синтаксисом на примере go-oleg. Моя проверена и работоспособна.
Я добавил в код несколько комментариев.
источник
Если вы используете Express, вы можете использовать модуль express-mongo-db, который позволяет вам получить соединение с базой данных в объекте запроса.
устанавливать
server.js
маршруты / users.js
источник
go-oleg в основном прав, но в наши дни вы (вероятно) не хотите использовать сам «mongodb», а скорее используйте какой-то фреймворк, который сделает за вас много «грязной работы».
Например, мангуст - один из самых распространенных. Вот что у нас есть в нашем исходном
server.js
файле:Это все, что нужно для его настройки. Теперь используйте это в любом месте вашего кода
И вы получите тот экземпляр, который настроили с помощью
mongoose.connect
источник
Инициализируйте соединение как обещание:
А затем вызывайте соединение всякий раз, когда хотите, чтобы вы выполнили действие с базой данных:
источник
Протестированное решение, основанное на принятом ответе:
mongodbutil.js:
app.js:
activity.js - маршрут:
источник
Вот моя установка в 2020 году:
./utils/database.js
/app.js
источник
мы можем создать файл dbconnection, например dbconnection.js
а затем используйте этот файл в своем приложении, например
а затем используйте это внутри своей функции async
надеюсь, это сработает
источник
Я немного опоздал, но и свое решение добавлю. Это намного более простой подход по сравнению с ответами здесь.
В любом случае, если вы используете MongoDB версии 4.0 и Node.js 3.0 (или более поздние версии), вы можете использовать
isConnected()
функцию изMongoClient
.У меня это сработало. Надеюсь, поможет.
источник
Я опаздываю на вечеринку, но, надеюсь, этот ответ кому-то поможет, это функциональный код:
db.js
Мы экспортируем одну функцию для подключения к mongo, а другую - для получения экземпляра подключения.
app.js
Мы должны выполнить требование модуля auth после инициализации соединения, иначе функция getDb вернет undefined.
module.js
источник
Поскольку это помечено Express, я подумал, что упомянул бы, что в Express есть встроенная функция для обмена данными между маршрутами. Есть объект под названием app.locals. Мы можем прикрепить к нему свойства и получить к нему доступ изнутри наших маршрутов. Вы просто создаете экземпляр своего mongo-соединения в файле app.js.
Теперь к этому соединению с базой данных можно получить доступ в пределах ваших маршрутов, как показано ниже, без необходимости создания дополнительных модулей.
Этот метод гарантирует, что у вас будет открыто соединение с базой данных на время работы вашего приложения, если вы не решите закрыть его в любое время. Он легко доступен
req.app.locals.your-collection
и не требует дополнительных модулей.источник
Если вы решите использовать мангуст в своем приложении, отредактируйте файл app.js с помощью следующего фрагмента
app.js
Следующий шаг: определите модели для вашего приложения, которые требуют их, и выполните операцию CRUD напрямую, например
blogSchema.js
использование createBlog.js
Вам не нужно всегда подключаться к mogoDB ....
источник
источник
источник
Я считаю, что это хорошо работает :)
mongoUtil.ts
anyFile.ts
источник
javascript
, не думаю, что ответ TypeScript подходит.Основываясь на принятых ответах, я использую простой подход. Но используйте это только в том случае, если вы хотите использовать
db
внутреннюю функцию, которая будет выполнена через некоторое время. Например: в функциях экспресс-маршрута это самый простой подход, который вы можете использовать.mongo.js
Теперь в других файлах, где вам нужен объект db,
user.js
источник