안녕하세요
Node.js 환경에서 ES6 문법 사용 시 __dirname 절대경로 가져오기 본문
https://github.com/nodejs/node/issues/37845
https://stackoverflow.com/questions/46745014/alternative-for-dirname-in-node-js-when-using-es6-modules
Node.js 환경에서 ES6 문법을 사용할 때 그냥 __dirname을 가져올 수 없다.
app.use(express.static(path.join(__dirname, "/frontend/build")));
ReferenceError: __dirname is not defined in ES module scope
이 에러는 ECMAScript 모듈 시스템에서 __dirname 변수를 사용할 때 발생할 수 있는 문제입니다.
__dirname은 CommonJS 모듈 시스템에서 사용할 수 있는 Node.js의 전역 변수이지만,
ECMAScript 모듈 시스템에서는 사용할 수 없습니다.
ECMAScript 에서는 import.meta.rul 을 이용하여 __dirname을 가져온다.
const __dirname = path.dirname(new URL(import.meta.url).pathname);
app.use(express.static(path.join(__dirname, "frontend", "build")));
하지만 path.dirname과 함께 이용하면 안된다.
그 이유는, path.dirname 으로 가져온 경로는 아래와 같은 상대경로로 나타나기 때문이다.
=> '\C:\Users\...' (잘못된 케이스)
=> 'C:\Users\...' (올바른 케이스)
build 한 파일을 보내줄 때
res.sendFile은 반드시 절대경로와 함께 이용해야만 하기 때문이다.
app.get("*", (request, response) => {
response.sendFile(path);
});
TypeError: path must be absolute or specify root to res.sendFile.
__dirname을 절대경로로 만들어 주는 방법 :
import { fileURLToPath } from "url";
url 내장 라이브러리의 fileURLToPath를 이용하면 절대경로를 가져온다.
const __dirname = path.dirname(fileURLToPath(import.meta.url));
정리
fileURLToPath 로 __dirname의 절대경로를 변수에 저장,
sendFile로 build파일 전송
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
app.use(express.static(path.join(__dirname, "frontend/build")));
const absolutePath = path.join(__dirname, "/frontend/build/index.html");
app.get("*", (request, response) => {
response.sendFile(absolutePath);
});
'유튜브컨텐츠탐색-StelLife > Node.js' 카테고리의 다른 글
프로젝트(1) - React 서버 구현 (0) | 2023.02.08 |
---|