Подключить синхронно к mongodb
Я хотел бы сначала подключиться к mongodb, а затем запустить все остальное в своем приложении.
Чтобы сделать это, я должен написать что-то вроде:
MongoClient.connect("mongodb://localhost/test", function(err, connection) {
if (err) { console.error(err); }
db = connection;
var app = express();
// Include API V1
require("./apiv1.js")(app, db);
app.listen(3000, function(err) {
if (err) { console.error(err); } else { console.log("Started on *:3000"); }
});
});
Это делает мое приложение полностью отступом внутри функции .connect... Который выглядит уродливым и занимает пространство, когда я работаю над своим проектом.
Я думаю, что лучшим решением было бы синхронное соединение MongoDB (даже из-за того, что соединение с БД мое приложение не может работать, поэтому зачем мне что-то делать во время соединения?), а затем запускать остальную часть моего кода.
Как я могу это сделать?
Ответы
Ответ 1
Вы не можете синхронно подключаться к MongoDB, но вы можете избавиться от этого уродливого обратного вызова из вашего кода.
Лучший способ сделать это - принять некоторую оболочку вокруг node-mongodb-native
driver.
Взгляните на следующие модули.
var mongojs = require('mongojs');
var db = mongojs('localhost/test');
var mycollection = db.collection('mycollection');
var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/test", {native_parser:true});
var monk = require('monk');
var db = monk('localhost/test');
var users = db.get('users')
Конечно, внутренне все они устанавливают соединение MongoDB асинхронно.
Ответ 2
Используя библиотеку async
, вы можете решить некоторые из этих проблем.
Например, при запуске моего сервера я делаю следующее:
async.series([
function(callback){
// Initialize the mongodb connection and callback on completion in init.
db.init(function(){
callback();
});
},
function(callback){
// Listen on requests etc.
webServer.init(function(){
callback();
});
},
function(callback){
// Set up anything else that I need
callback();
}
]);
Ответ 3
Вы можете сделать это с помощью thunky, thunky выполняет асинхронную функцию один раз и кэширует ее, последующие вызовы возвращаются из кеша.
const MongoClient = require('mongodb').MongoClient;
const thunky = require('thunky');
var connect = thunky(function(cb){
let url = 'mongodb://localhost:27017/test';
MongoClient.connect(url, function(err, client){
console.log('connecting')
cb(err, client);
})
})
connect( (err, client) => {
console.log('connection 1')
})
connect( (err, client) => {
console.log('connection 2')
})
connect( (err, client) => {
console.log('connection 3')
console.log('closing')
client.close();
})
* Примечание. Я использую последний драйвер xx.dx 3.x.
Ответ 4
Если вы используете Node 6 и более поздние версии, вы можете сделать что-то вроде этого:
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/mydb';
let db = null;
getdb();
//your code
async function getdb() {
db = await MongoClient.connect(url);
}
- Принесите библиотеку mongodb.
- Объявить константу URL.
- Объявить переменную db как null.
- Вызвать функцию getdb.
- Создайте функцию getdb, которая использует асинхронное слово
- Присвоить переменной db ожидаемый результат соединения с ключевым словом.