2013-12-18 3 views
1

내 데이터베이스 (크래들을 사용하는 couchDB)에 연결하는 모듈을 만들려고합니다. 결국 모듈은 'db'변수를 내 보냅니다.비동기 적으로 NPM 모듈로드

var cradle = require('cradle'), 
config = require('./config.js'); 

var db = new(cradle.Connection)(config.couchURL, config.couchPort, { 
    auth: { 
     username: config.couchUsername, 
     password: config.couchPassword 
    }, 
    cache: true, 
    retries: 3, 
    retryTimeout: 30 * 1000 
}).database('goblin'); //database name 



//Check if DB exists 
db.exists(function (err, exists) { 
    if (err && exists) { 
     console.log("There has been an error finding your CouchDB. Please make sure you have it installed and properly pointed to in '/lib/config.js'."); 
     console.log(err); 
     process.exit(); 
    } else if (!exists) { 
     db.create(); 
     console.log("Welcome! New database created."); 
    } else { 
     console.log("Talking to CouchDB at " + config.couchURL + " on port " + config.couchPort); 
    } 

}); 

module.exports = db; 

문제는 db.exists가 부르는 비동기입니다, 그것은 존재하지 않는 경우 내가 나머지를 초래, 그것은이 완료되기 전에 변수가 변수를 수출 생각 : 여기

코드입니다 시스템.

var db = require('./couchdb.js'); 

거대한 중첩 콜백을하지 않고 이런 문제를 해결하기 위해 일어나고, 또는 모범 사례에서이 문제를 방지 할 수있는 방법이 있나요 :

그것은 실행 노드 페이지에 정상적인 방법을 포함하고있어?

참조 용으로 여기에서 전체 응용 프로그램 (https://github.com/maned/goblin)과 프로젝트에서 참조한 버그 (https://github.com/maned/goblin/issues/36)를 볼 수 있습니다.

답변

2

비동기 스타일을 채택하십시오. 대신 모듈에서 db 수출의이 같은 비동기 함수를 export :

module.exports = { 
    getDb: function(callback) { 
    db.exists(function(err, exists) { 
     if (exists && !err) {callback(db);} else { /* complain */ } 
    }); 
    } 
}; 

이제 응용 프로그램을 할 수있는 단지 require('mymodule').getDb(appReady)appReady이 유효하고 사용할 수있을 알려진 db 객체를 받아 들인다 곳.

+0

이것은 좋은 해결책입니다! 지금 시도하고 있지만 db 개체에 문제가 있습니다. 이 스레드는 계속 업데이트됩니다. 콜백을 중첩하지 않아도되도록 intially 시도했지만 (콜백에 코드가 많이 포함됨) 어쩌면 그렇게하는 것이 가장 좋은 방법 일 수 있습니다. – streetlight

+0

콜백에서 다른 기능으로 변경되지 않는 부분이나 "개구쟁이"라고 느끼는 부분을 "폐쇄"할 수 있습니다. 그렇게하면 아주 작은 함수 만 이벤트 처리기를 호출 할 때마다 동적으로 생성됩니다. – wberry

관련 문제