Подтвердить что ты не робот

Подключить синхронно к 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 (даже из-за того, что соединение с БД мое приложение не может работать, поэтому зачем мне что-то делать во время соединения?), а затем запускать остальную часть моего кода.

Как я могу это сделать?

4b9b3361

Ответ 1

Вы не можете синхронно подключаться к MongoDB, но вы можете избавиться от этого уродливого обратного вызова из вашего кода.

Лучший способ сделать это - принять некоторую оболочку вокруг node-mongodb-native driver.

Взгляните на следующие модули.


mongojs

var mongojs = require('mongojs');
var db = mongojs('localhost/test');
var mycollection = db.collection('mycollection');

mongoskin

var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/test", {native_parser:true});

monk

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 ожидаемый результат соединения с ключевым словом.