[에러] Heroku 배포 후 Internal Server Error

sarifor·2022년 3월 1일
0

문제

Node.js + Express 앱에서, ES6를 ES5로 바꾸는 방법에는 babel src -d build && node build/index.js 말고도 nodemon --exec node_modules/.bin/babel-node src/index.js 가 있다는 것을 알았다.
Heroku에도 babel-node로 deploy할 수 있나 실험해 봤는데, 웹페이지 URL에 접속하니 Internal Server error만 뜨고 메인 페이지가 보이지 않는다.
(깃허브에서 해당 커밋 보기)

환경

Node.js 16.14.0
NPM 8.3.1

원인

index.js의 SESSION_SECRET은 환경변수이나, Heroku 설정 페이지에 SESSION_SECRET 변수 및 값을 추가해두지 않았던 게 원인.
(깃허브에서 코드 보기)

app.use(
  session({
    name: "cookie from my app",
    secret: process.env.SESSION_SECRET,
    cookie: {
      httpOnly: true,
    },
    resave: true,
    saveUninitialized: true
  })
);

해결

heroku logs --tail에서, Error: secret option required for session이라고 말하고 있길래,
Heroku 설정 페이지에 SESSION_SECRET 변수/값 추가했더니, URL 정상 접속됨.
(깃허브에서 해당 커밋 보기)

보충

ES(ECMAScript)

JavaScript 버전의 한 종류. JS는 1995년에 발명되고, ECMA 표준이 된 건 1997년이다.
흔히 쓰이는 ES6는 ECMAScript 2015이다. ES6로 넘어오면서 JavaScript 자체에서 ES6 Module이라는 이름으로 모듈화를 지원하기 시작하였다. e.g. import, export
2016년부터는 버전명에 연도만 쓰이고 있다. e.g. ECMAScript 2016

CommonJS

JavaScript를 브라우저뿐 아니라, 서버사이드 앱이나 데스크톱 앱 등 범용적으로 사용하기 위해 2009년 설립된 프로젝트. 모듈 포매팅 시스템.
2009년 출시된 Node.js의 모듈 시스템도 CommonJS이다.
CommonJS에선 ES6의 일부 문법(import, export)를 지원하지 않는다.

Express 앱에서 ES6를 ES5로 바꿔줘야 하는 이유

ES6와 달리, ES5는 거의 모든 브라우저에서 지원된다.
한편 Express의 기반인 Node.js의 모듈 시스템 CommonJS에서는 ES6의 일부 문법(import, export)를 지원하지 않는다.
위의 두 이유로, Express 앱에서 ES6을 쓰고 싶다면 Babel을 이용하여 ES5로 바꾸는 것이다.

Node.js(CommonJS 환경)에서 ES6를 사용하는 법

방법 1) babel 사용 (맨 위쪽의 내용)

방법 2) package.json의 type 필드에 module 기입 (프로젝트 단위 적용) (미확인)

  { 
    "type": "module" 
  } 

방법 3) Node.js 실행 시, --experimental-module 옵션 넘기기 (Node.js 버전 12 이상) (미확인)

방법 4) ES6 파일 확장자를 .js에서 .mjs로 변경 (파일 단위 적용) (미확인)

요약

생략

참고

profile
잠수 탄 블로그 같지만 살아있어요

0개의 댓글