2014-05-25 12 views
1

데이터베이스에 액세스해야하는 Express 미들웨어를 작성 중입니다. 그것은 패키지로 배포 될 예정이므로 가능한 한 자체 포함되도록하겠습니다. 데이터베이스 연결을 어떻게 처리해야하는지 궁금합니다. 비동기식 (물론)이지만, 패키지가 초기화 될 때 한 번만 발생하면됩니다. 이것이 어디에서 일어나야 하는가?비동기 초기화가있는 Express 미들웨어

나는 이런 생각을하고있었습니다. 문제는 데이터베이스가 준비되기 전에 미들웨어가 곧바로 통과된다는 것입니다.

// App 
app.use(myMiddleware({ 
    db: "<db connection string>" 
}); 

// Middleware 
module.exports = function(db) { 
    // Open db 

    return function(req, res, next) { 
     // Middleware stuff 
    } 
} 
+0

'다음'을 살펴보십시오. [이 질문과 답변] (http://stackoverflow.com/q/8710669/1348195)을 참조하십시오. –

+0

어디에 건네 주시겠습니까? – giodamelio

+0

'.next'를 호출하여 데이타베이스 연결이 끝나면 완료되었음을 알립니다. –

답변

1

나는이 같은 싱글 톤을 권장하지 않습니다. 의존성 삽입은 더 나은 해결책이며, 응용 프로그램 당 연결은 거의 확장 할 수 없습니다. 연결 풀이 더 좋은 아이디어 일 수 있습니다.

var db = null; // to keep our instance 
var asked = false; // to not make several requests that override each other 
function openDb(db,ready){ 
    // if we already have it, we return the instance 
    if(db !== null) ready(null,db); 
    // if it was already asked by another instance, keep track of it 
    // to avoid multiple requests.   
    if(asked) asked.push(ready); 
    asked = []; 
    openDbCode(db,function(err,result){ 
     if(err) { 
      ready(err,null); // error case 
      asked.forEach(function(fn){ fn(err,null); }); // notify waiters of failure 
     } 
     db = result; // save the reference 
     asked.forEach(function(fn){ fn(db,null); }); // notify all waiters 
    }) 
} 

이 기능은 효과적으로 첫번째 아스 커의 데시벨을 대기 한 후 같은 인스턴스에있는 모든 사람을 호출, 당신이 뭔가를 할 수 있다고 말했다

. 이 함수는 제공된 첫 번째 연결 문자열을 사용합니다.

module.exports = function(db) { 
    return function(req, res, next) { 
     openDb(db,function(err,db){ 
      if(err) handleDbOpenErrorLogicHere(); 
      // middleware stuff, same db available here, call next to continue 
     }); 
    }; 
} 
+0

고마워, 그게 내가 필요한거야. 당신 말이 맞아, 그것은 최고의 솔루션처럼 보이지 않습니다. 나는 나의 건축에 ​​대해 조금 생각해야 할 것이다. – giodamelio

관련 문제