programing

mongodb에 동기식으로 연결

elecom 2023. 7. 12. 22:15
반응형

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 연결을 동기화하는 것입니다(비록 제 앱이 DB 연결 없이는 작동할 수 없는데 왜 제가 연결되는 동안 무언가를 해야 합니까?). 그리고 나서 제 나머지 코드를 실행하는 것입니다.

어떻게 해야 할까?

MongoDB에 동시에 연결할 수는 없지만 코드에서 이 추악한 콜백을 제거할 수 있습니다.

가장 좋은 방법은 드라이버 주변의 포장지를 사용하는 것입니다.

다음 모듈을 살펴봅니다.


몽고즈

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 연결을 설정하고 있습니다.

사용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();
    }
]);

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);
}
  1. mongodb 라이브러리를 가져옵니다.
  2. URL을 상수로 선언합니다.
  3. 변수 db를 null로 선언합니다.
  4. getdb 함수를 호출합니다.
  5. 비동기 단어가 처음인 getdb 함수를 생성합니다.
  6. 키워드가 대기하는 연결 결과를 DB 변수에 할당합니다.

Tunky, Tunky를 사용하면 비동기 함수를 한 번 실행하고 캐시하면 이후 호출이 캐시에서 반환됩니다.

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();
})

*참고: 최신 3.x mongodb 드라이버를 사용하고 있습니다.

언급URL : https://stackoverflow.com/questions/25908688/connect-synchronously-to-mongodb

반응형