2011-08-08 6 views
0

이것은 단순한 자바 스크립트 범위 지정 문제 (그림 참조) 일 뿐이며 여러 가지 방법으로 시도했지만 제대로 작동하지 않는 것으로 보입니다.변수 HTTP/HTTPS 익스프레스 서버

생각은 express.createServer()에 대한 호출로 HTTP에 Express.js 서버 기본값 만 선택적으로 ./conf/cert.pem./conf/key을 탐지 한 경우 HTTPS로 전환한다는 것입니다 .pem. 노드의 path.exists()에 비동기 호출을 사용하고 있습니다. 두 번째 콜백 인수에 부울 결과가 포함되어 있습니다.

나는 HTTPS 서버가 "안전한"(두 파일의 존재 여부에 대한 결과를 안다) 때까지 HTTPS 서버가 생성되지 않도록하기 위해 현재 중첩되어 있습니다. 그러나 언급 한 것처럼 여러 가지 방법을 시도했지만 바깥 쪽 app 변수를 수정할 수 없습니다.

지금 당장 볼 수없는 간단한 수정 사항이 있지만 확실한 도움을 드릴 수는 있습니다.

app = module.exports = express.createServer(); 

path.exists('./conf/key.pem', function(exists){ 
    var keyExists = exists; 
    path.exists('./conf/cert.pem', function(exists) { 
     var certExists = exists; 
     if (keyExists && certExists) { 
      app = express.createServer({ 
       key: fs.readFileSync('./conf/key.pem'), 
       cert: fs.readFileSync('./conf/cert.pem') 
       }); 
     } 
    }); 
}); 

답변

3

이것은 이상적이지 않습니다. https 서버가 덮어 쓰게하기 위해서만 일반 http 서버를 생성해서는 안됩니다. 당신이 말하는 문제는 app 변수를 아래에 설정했지만 실제로는 module.exports이 아님을 알 수 있습니다. 따라서 module.exports은 여전히 ​​생성 된 원래 서버를 나타냅니다. 다음과 같이해야합니다.

var app = express.createServer({ 
    key: fs.readFileSync('./conf/key.pem'), 
    cert: fs.readFileSync('./conf/cert.pem') 
}); 
module.exports = app; 

파일이 먼저 존재하는지 확인할 이유가 없습니다. 파일이 존재하지 않으면 readFileSync는 단지 ENOENT를 던집니다. 이벤트 루프를 시작하기 전에 비동기 적으로 아무 것도 할 이유가 없습니다.

난 당신이 조건부은 https로 서버를 원하는 이유를 모르겠지만, 비슷한 당신이 뭘하려고했는지에 뭔가를 :

var app; 
try { 
    app = express.createServer({ 
    key: fs.readFileSync('./conf/key.pem'), 
    cert: fs.readFileSync('./conf/cert.pem') 
    }); 
} catch(e) { 
    if (e.code !== 'ENOENT') throw e; 
    app = express.createServer(); 
} 
module.exports = app; 

을 또는이 좋네요 볼 수 있습니다

var app; 
if (path.existsSync('./conf/key.pem')) { 
    app = express.createServer({ 
    key: fs.readFileSync('./conf/key.pem'), 
    cert: fs.readFileSync('./conf/cert.pem') 
    }); 
} else { 
    app = express.createServer(); 
} 
module.exports = app; 

수백만 건의 요청을 동시에 처리 할 필요가없는 한 동기식으로 작업하는 것이 좋습니다.

+0

path.existsSync() 메소드를 지적 해 주셔서 감사합니다! 실제로 문서의 이전 버전을 보았습니다. (게으름을 피하고 노드 홈페이지 : D로 이동하는 대신 링크를 검색하여 동기 버전이 없었습니다.) 확실히 일이 쉬워집니다! 코드가 현재보다 명확하고 위험성은 적지 만 여전히 동일한 범위 지정 문제가 있습니다. * module.exports = app * 이후에도 app는 * configure * 블록에 도달하면 정의되지 않습니다. –

+0

** 업데이트 ** : 그것을 파악했습니다. 고마워요, 고마워요! 이전 메모를 처리하기 위해 HTTPS 서버를 실행하는 것은 이전에 생성 된 인증서에 따라 다릅니다. 앞으로 모든 것을 자동화하는 빌드 프로세스를 만들려고 노력하지만, 그 동안 종속성을 우회하고 있습니다. 또한 HTTPS를 통해 작동하는 대부분의 인스턴스를 보여 주지만 원하는 경우 정규 HTTP를 사용할 수 없도록 최종 사용자를 피하고 싶지 않습니다. 결국 나는 일종의 구성 파일을 만들어 명시 적 선택을 지정합니다. –

관련 문제