1. 문제 분석
fs.readFileSync()는 Node.js의 파일 시스템(fs) 모듈에 포함된 함수로, 파일을 동기적으로 가져오는데요.
파일을 가져오기 위해 위 함수를 사용했지만,
Error: ENOENT: no such file or directory, 오류가 나왔습니다.
const private_key_file = fs.readFileSync('../libs/authkey.p8');
이상하게 경로를 절대경로로 하면 파일을 찾고, 상대경로만 오류가 나더군요.
하지만 서버를 올리면 절대경로를 사용할 수 없기에, 해결 방법을 찾아야 했습니다.
2. 문제 원인
fs.readFileSync()는 파일을 읽을 때
현재 작업 디렉터리(current working directory, CWD)를 기준으로 상대 경로를 해석하기 때문이에요.
현재 작업 디렉터리는 보통 터미널에서 명령을 실행하는 위치인데요.
아래와 같은 폴더 구조가 있다고 칠게요.
/myproject
├── /libs
│ └── authkey.p8
├── /src
│ └── index.js
└── package.json
index.js 에서 authkey.p8를 찾는다고 가정해 볼게요.
그럼 보통 (../libs/authkey.p8) 이렇게 찾을 건데요.
하지만 현재 작업 디렉터리는 /myproject이기 때문에
/myproject 바깥의 libs/authkey.p8를 찾아서 에러가 납니다.
(/myproject 기준으로 상대경로를 해석해서)
그래서 아래 2가지 방법으로 해결하시면 돼요!
3. 문제 해결
3.1 현재 작업 디렉터리 고려해서 상대경로 적기
const private_key_file = fs.readFileSync('./libs/authkey.p8');
간단하게, /myproject 기준으로 상대 경로를 적으면 됩니다.
근데 이렇게 되면, 상대경로마다 다른 기준으로 코딩하게 돼서 헷갈릴 것 같네요.
3.2 url과 path 이용하기
import fs from "fs";
import { fileURLToPath } from "url"; //URL 객체를 파일 경로로 변환
import { dirname, join } from "path";
const __filename = fileURLToPath(new URL(import.meta.url));
const __dirname = dirname(__filename);
const private_key_file = fs.readFileSync(join(__dirname, '../libs/authkey.p8'));
위 코드에서 __dirname은 현재 디렉터리를 지칭하기 때문에,
상대경로를 사용할 수 있어요!