비동기를 공부하기 위해 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.json
에 type: '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에 있는 내용을 불러와서 출력했다!!!
동기 비동기가 뭔지는 알지만 블로깅을 하면서 기본기를 확실히 잡고 가자는 마음에 하다보니 여직까지 내가 안 것이 안게 아니구나라는 생각이 많이 든다. 효율적으로 공부하지 않은 시간은 후회가 되지만 차근히 나아갈 생각이다. 비동기 동기를 공부 중이라 promise
와 async-await
를 이어서 공부하고 블로깅할 생각이다.
alternatives-dirname-node-js-es-modules
__dirname nodejs docs