__dirname in Node.js

references

이번 글은 아래 글을 참고하여 작성하였습니다.
참조글


MERN Clone Coding_blog-app
위 동영상을 보며 clone coding하며 마주친 __dirname이라는 녀석. 과연 정체가 무엇일까?


Node.js의 공식문서에 따르면

__dirname이란 현재 모듈의 경로 이름이다. __filenamepath.dirname()과 기능이 같다.
ex)/Users/mjr에서 node example.js을 실행

console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr

뭔가 현재 경로를 알려주는 아이 같은데?
그럼 ./과는 어떻게 다른 거지?

아래 내가 searching한 내용을 정리해보겠다.


./은 현재 실행 중인 directory. 즉, terminal창에 node를 입력한 directory를 나타낸다. 예외로require() function을 쓰게 되면 require를 포함한 file의 directory를 인식한다.
__dirname은 언제나 현재 script가 실행된 directory를 나타낸다. 만약 __dirname/d1/d2/myscript.js에 넣어 실행하게 되면 값은 /d1/d2가 된다.

예를 통해 살펴보자.

/home/user/dir/files/config.json

{
  "hello": "world"
}

/home/user/dir/files/somefile.txt
text file

/home/user/dir/dir.js

var fs = require('fs');
console.log(require('./files/config.json'));
console.log(fs.readFileSync('./files/somefile.txt', 'utf8'));

cd /home/user/dir을 입력하고 node dir.js로 파일을 실행하면 output은 아래와 같다.

{ hello: 'world' }
text file

그러나 같은 script를 /home/user에서 실행한다면 output은 아래와 같이 error message를 출력하게 된다.

{ hello: 'world' }
Error: ENOENT, no such file or directory './files/somefile.txt'
    at Object.openSync (fs.js:228:18)
    at Object.readFileSync (fs.js:119:15)
    at Object.<anonymous> (/home/user/dir/dir.js:4:16)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)
    at EventEmitter._tickCallback (node.js:192:40)

그 까닭은 ./require와 함께 작동하지 fs.readFileSync와는 쓰이지 않기 때문이다. fs.readFileSync의 경우 .//home/user/로 인식해 /home/user/files/somefile.txt가 존재하지 않는다고 보는 것이다.

좋은 웹페이지 즐겨찾기