경로 문제(swagger,dotenv)
절대 경로, 상대 경로
I. 개요
swagger로 API와 .env로 환경변수 관리를 위해 경로를 설정하는 과정에서 오류가 발생했다.
구글링해서 그대로 따라했는데 안되는 경우가 많아 어려웠다.
// /swagger/swagger.js
// Swagger로 관리할 api들을 연결할때 오류 발생.
const swaggerUi = require("swagger-ui-express");
const swaggerJsdoc = require("swagger-jsdoc");
const options = {
swaggerDefinition: {
openapi: "3.0.0",
info: {
version: "1.0.0",
title: "미니 프로젝트",
description:
"Express Swaager swagger-jsdoc 방식 RestFul API 클라이언트 UI",
},
servers: [
{
url: "http://localhost:3000", // 요청 URL
},
],
},
apis: ["./routers/*.js"],
// s에러 발생
}
swagger와 routers폴더가 같은 디렉토리에 있어서 이렇게 경로를 설정했지만 에러가 발생했다. 다른 블로그와 비슷한 구조라 똑같이 작성했는데 에러가 발생하여 _dirname+"/../routers/*.js"
처럼 절대 경로를 넣어 해결했다.
// .env 에서 환경 변수를 가져오는 중 오류 발생.
require('dotenv').config();
console.log(process.env.DB_HOST);
// undefined
require('dotenv').config({'path': __dirname + '/.env'});
console.log(process.env.DB_HOST);
//localhost
그런데 env파일에서도 같은 오류가 발생해서 같은 문제임을 느끼고 제대로 알고자 공부한 뒤 해결했다.
II. 경로
1. 경로 작성법
- 절대 경로
- 고유 경로.
- 항상
/
로 시작한다.
- 상대 경로
- 위치한 곳을 기준으로 경로를 파악하는 법.
.
현재 디렉토리,..
부모 디렉토리.
2. 현재 작업 경로 확인법
1) __filename
- file명을 포함한 절대 경로
2) __dirname
- 현재 파일의 폴더 경로 (파일 명 제외)
3) process.cwd()
- node명령을 호출한 작업 디렉토리의 절대 경로
III. 문제 해결
결국 노드 명령을 어디에서 호출했냐에 따라 경로가 설정 되므로 process.cwd()를 기준으로 상대 경로를 설정해야 한다.
vscode로 연 폴더는 /Programmers 이다.
console.log('cwd 경로:'+process.cwd())
console.log('dirname 경로:'+__dirname)
/*
cwd 경로: C:\Users\yoobi\Documents\Programmers
dirname 경로: C:\Users\yoobi\Documents\Programmers\express-demo
*/
디버깅은 “program”: “${file}”로 해놔서 터미널 위치 상관없이 잘 돌아가지만, 실제 노드가 돌아가는 곳은 process.cwd()이다.
// swagger.js
// "./routers/*.js"는 잘못된 상대 경로
apis: ["./express-demo/routers/*.js"],
//require('dotenv').config()에서는 process.cwd()기준으로 실행되므로
// 처리되므로 programmers/.env로 자동 들어가기에 경로 오류
require('dotenv').config({path:'./express-demo/.env'});
연결해야 할 swagger와 .env는 express-demo폴더 안에 있으므로, ./express-demo/routers/*.js
이렇게 상대 경로를 작성하면 된다.
열심히 찾고 그대로 해도 오류가 안 고쳐져서 몇 시간 골머리를 앓았지만 기회로 삼고 공부하니 이제서야 제대로 알아가는 느낌이 난다.
여담으로 express-demo/routers/*.js
로 작성해도 똑같이 경로가 들어가는데, Node.js에서는 ./를 붙이던 안붙이던 큰 차이가 없이 상대 경로로 인식 된다. Python이나 PHP도 비슷하게 동작하지만 경우에 따라 다르고, (import문 모듈 로드 시 등등.. ) 상황에 따라 다르게 해석될 수 있으므로 생략하지 않고 ./ 를 붙이고 쓰는게 좋다.