ReferenceError: __dirname is not defined in ES module scope

GI JUNG·2022년 12월 12일
4

nodejs

목록 보기
5/6
post-thumbnail

비동기를 공부하기 위해 ES Module 환경에서 파일을 읽는 도중 ReferenceError: __dirname is not defined in ES module scope라는 에러가 발생했다.

dirname을 지금까지 의문없이 쓰면 나왔기 때문에 왜 dirname을 현재 scope에서 찾지 못하나 의아했다. 이에 대한 해답은 missing __dirname when using es module로 검색하여 여기에서 찾을 수 있었다.

💡 다른 곳에서는 __dirname을 path를 import 하고 const __dirname = path.resolve()와 같은 방법이 있다고 하는데 내가 스스로 해 본 결과 이와 같이하면 원하는 결과가 나오지 않는다.

🍀 오류 발생

오류를 살펴보기 이전에 나는 ES Module을 썻다고 했는데 이는 package.jsontype: 'module'을 넣어주면 된다. 일반적인 require를 이용해서 module을 불러오는 것은 commonJS이다.

package.json

{
  ...//
  "type": "module",
  ...//
}

showPath.js

import path from "path";

console.log(`__dirname     ->`, __dirname);
console.log(`__filename    ->`, __filename);
console.log(`process.cwd() ->`, process.cwd());

위의 showPath.js를 실행시키면 아래와 같이 오류가 발생한다.

*왜 오류가 날까?🤔*
이는 nodejs docs에서 ES module을 사용할 경우 사용가능하지 않으며 import.meta.url을 이용해서 흉내낼 수 있다고 한다.

🍀 오류 해결
nodejs docs나 내가 참고했던 개인 테크 블로그와 같이 __dirname을 import.meta.url로 흉내내주면 된다.

import { fileURLToPath } from "url";   // 👈 추가

const __dirname = fileURLToPath(new URL(".", import.meta.url));   // 👈 추가
const __filename = fileURLToPath(import.meta.url);   // 👈 추가

console.log(`__dirname     ->`, __dirname);
console.log(`__filename    ->`, __filename);
console.log(`process.cwd() ->`, process.cwd());

출력

오류 해결했다~~~🎉 항상 느끼는 것이지만 오류나 막히는 것을 끙끙대다가 결국에 해냈을 때 성취감은 맛나닼ㅋㅋ

자이제 오류를 해결했으니 파일을 읽는 것을 해보면

data.txt

data text file content!!!

readFile.js

import fs from "fs/promises";
import path from "path";
import { fileURLToPath } from "url";

const __dirname = fileURLToPath(new URL(".", import.meta.url));
const __filename = fileURLToPath(import.meta.url);

function fetchFile(filePath) {
  fs.readFile(filePath, { encoding: "utf-8" }).then((data) =>
    console.log(data)
  );
}

const filePath = path.join(__dirname, "data.txt");

fetchFile(filePath);   

성공적으로 text file에 있는 내용을 불러와서 출력했다!!!

🍀 마치며

동기 비동기가 뭔지는 알지만 블로깅을 하면서 기본기를 확실히 잡고 가자는 마음에 하다보니 여직까지 내가 안 것이 안게 아니구나라는 생각이 많이 든다. 효율적으로 공부하지 않은 시간은 후회가 되지만 차근히 나아갈 생각이다. 비동기 동기를 공부 중이라 promiseasync-await를 이어서 공부하고 블로깅할 생각이다.

📚 참고

alternatives-dirname-node-js-es-modules
__dirname nodejs docs

profile
step by step

0개의 댓글