Node.js и MongoDB, повторно используя объект DB
Я новичок как с 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, но из внешнего вида этого (http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html) похоже, что я должен использовать MongoClient, а не db(). И я не уверен, что он решает мою проблему и...
Ответы
Ответ 1
Вы всегда можете написать модуль, который инициализирует подключения к базе данных и сделает их доступными во всей вашей программе. Например:
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, я думаю, что новый синтаксис они обнадеживают. В любом случае, это, по сути, клиентский объект, который вы хотите сохранить и сделать доступным независимо от того, какой стиль вы используете.
Ответ 2
Из вашего последнего фрагмента кода, похоже, вы используете 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
});