2012-11-18 4 views
6

"server.js"라는 Node.js 파일이 있습니다. 스크립트에서 폴더 외부에서 Node.js 파일을 실행하면 파일 경로가 깨집니다.

, 나는 같은 것을 사용하여 일부 파일을 여는 오전 : bash 쉘을 사용

var certPem = fs.readFileSync('cert_and_key_dev.pem', encoding='ascii'); 

을 경우 server.js이며, 명령 실행 디렉토리에 I CD를

[mybashshell] $ 노드 server.js 그것은 작동

, 나는 오류 없어. 서버가 시작되고 실행됩니다.

이제 server.js 파일이있는 디렉토리에서 CD를 꺼낸 다음 동일한 쉘 명령을 다시 실행하여 서버를 시작하십시오.

내 "cert_and_key_dev.pem"파일 경로가 깨졌습니다.

이런 일이 발생할 것으로 예상하지 못했습니다. 나는 실행중인 스크립트 파일에 사용 된 경로가 bash 쉘 명령을 실행 한 위치가 아닌 스크립트 파일과 관련이 있어야한다.

아이디어가 있으십니까?

답변

13

스크립트 시작 부분에 넣으십시오.

process.chdir(__dirname); 

실행중인 파일 ( __dirname)의 디렉토리 경로로 프로세스의 작업 디렉토리를 변경합니다.

기능에 대한 자세한 내용은 this을 참조하십시오.

+0

이 방법과 chbrown에서 제공하는 방법간에 이점이 있습니까? 나는 더 적절한 방법이 궁금합니다. – Zhang

+0

그것은 실제로 목적에 달려 있습니다. 더 많은 "서버"를 실행한다면'__dirname'으로 변경하는 것이 좋습니다. 예를 들어, 폴더 업로드 스크립트를 실행하고 있다면 chbrown 코드를 사용하는 것이 좋습니다. 현재 작업 디렉터리 경로를 현재 스크립트의 디렉터리 경로 이상으로 사용하려는 빈도를 측정해야합니다. –

7

또는

var path = require('path'); 
var key = path.join(__dirname, 'cert_and_key_dev.pem'); 
var certPem = fs.readFileSync(key, encoding='ascii'); 

당신이 어떤 이유로 든 cd하지 않으려면

.

+0

LOL, 고마워, 둘 다 작동하지만 어느 쪽이 받아 들일지 모르겠다. 나는 똑같은 답을 줄 수 있기를 바란다. 나는 Julian Lannigan에게 먼저 대답했기 때문에 Rep boost를 사용할 수 있습니다. (당신이 chbrown을 좋아하지 않기를 바랍니다.) – Zhang

+1

의심 스럽다면 적은 코드가 승리합니다. 스크립트를 시작한 디렉토리를 알 필요가 없으면 Julian의 대답이 좋습니다. – chbrown

+0

그러나 장 (Zhang)은 변수를 변경하기 전에 항상 변수에 현재 작업 디렉토리를 저장할 수 있음을 기억하십시오. 'process.cwd()'를 호출하십시오. –

관련 문제