learn-express 폴더를 만들고, 항상 package.json을 제일 먼저 생성해야한다는 사실 잊지 말자!
package.json의 scripts 부분에 start 속성도 잊지말고 넣어줘야한다.
...
"scripts" : {
"start" : "nodemon app"
},
...
nodemon app 은 app.js를 nodemon으로 실행한다는 것이다.
서버코드에 수정 사항이 생길 때마다 재시작하기는 번거로워서 nodemon 모듈로 서버를 자동으로 재시작한다.
요청과 응답의 중간에 위치하여 미들웨어라고 불리는 이것은 익스프레스의 핵심이다. 라우터와 에러 핸들러 또한 미들웨어의 일종으로 미들웨어는 요청과 응답을 조작하여 기능을 추가하기도 하고, 나쁜 요청을 걸러내기도 한다.
app.use(미들웨어)
형태로 사용하며, 매개변수가 req, res, next인 함수를 넣으면 된다.
morgan 연결 후 localhost:3000에 다시 접속해보면 기존 로그 외에 추가적인 로그를 볼 수 있다.
app.use(morgan('dev'));
dev 모드에서 요청과 응답을 한눈에 볼 수 있어서 편리하다.
정적인 파일들을 제공하는 라우터 역할을 한다.
기본적으로 제공되어 설치가 필요없으며 express 객체 안에서 꺼내서 장착하면 된다.
app.use('요청 경로', express.static('실제 경로'));
app.use('/', express.static(path.join(__dirname, 'public')));
서버의 폴더 경로와 요청 경로가 달라서 외부인이 서버의 구조를 쉽게 파악할 수 없어서 보안에 도움이 된다. 또한, 정적 파일들을 알아서 제공해주므로 fs.readFile로 파일을 직접 읽어서 전송할 필요가 없다.
요청의 본문에 있는 데이터를 해석해서 req.body 객체로 만들어주는 미들웨어.
보통 폼 데이터나 AJAX 요청의 데이터를 처리하지만 멀티파트(이미지, 동영상, 파일) 데이터는 처리하지 못한다.
app.use(express.json());
app.use(express.urlencoded({ extended: false}));
JSON, URL-encoded 이 외에도 Raw, Text형식의 데이터를 추가로 해석할 수 있다.
Raw는 요청의 본문이 버퍼 데이터일 때, Text는 텍스트 데이터일 때 해석하는 미들웨어다.
요청에 동봉된 쿠키를 해석해 req.cookies 객체로 만든다.
app.use(cookieParser(비밀키));
인수로 비밀키를 넣어서 서명된 쿠키가 있는 경우, 제공한 비밀 키를 통해 해당 쿠키가 내 서버가 만든 쿠키라는 것을 검증할 수 있다. 비밀 키를 통해 만들어낸 서명을 쿠키 값 뒤에 붙인다.
쿠키를 지우려면 키와 값 외에 옵션도 정확히 일치해야 쿠키가 지워진다. 단, expires나 maxAge 옵션은 일치하지 않아도 된다.
세션 관리용 미들웨어.
로그인등의 이유로 세션을 구현하거나 특정 사용자를 위한 데이터를 임시적으로 저장해둘 때 매우 유용하다.
express-session은 인수로 세션에 대한 설정을 받는다.
미들웨어는 req, res, next를 매개변수로 가지는 함수(에러 처리 미들웨어만 예외적으로 err, req, res, next를 가진다)로서 app.use, app.get, app.post 등으로 장착한다.
여러 개의 미들웨어를 장착할 수도 있으며, 다음 미들웨어로 넘어가려면 next 함수를 호출해야한다.
미들웨어 간에 데이터를 전달하는 방법도 있다.
세션을 사용한다면 req.session 객체에 넣어도 되지만, 요청이 끝날 때까지만 데이터를 유지하고 싶다면 req 객체에 데이터를 넣으면 된다. 요청이 처리된느 동안 req.data를 통해서 미들웨어 간에 데이터를 공유할 수 있다.
미들웨어 안에 미들웨어를 넣어서 사용할 수 있다.
이 패턴이 유용한 이유는 기존 미들웨어의 기능을 확장할 수 있기 때문이다.
이미지, 동영상 등을 비롯한 여러 가지 파일들을 멀티파트 형식으로 업로드할 때 사용하는 미들웨어.
멀티파트 형식이란 enctype이 multipart/form-data인 폼을 통해 업로드하는 데이터의 형식을 의미한다.
multer 패키지 안에는 여러 종류의 미들웨어가 들어있다.
single
미들웨어를 사용multiple
을 사용fields
를 사용익스프레스를 사용하는 이유 중 하나는 라우팅을 깔끔하게 관리할 수 있다는 점이다. 라우터를 많이 연결하면 코드가 매우 길어져서 익스프레스에서는 라우터를 분리할 수 있는 방법을 제공한다.
app.js에서 app.get 같은 메서드가 라우터 부분이다.
라우터 주소에는 정규표현식을 비롯한 특수 패턴을 사용할 수 있다. 자주 쓰는 패턴 중 하나는 라우트 매개변수라고 불리는 패턴이다. '/user/:id' 주소에 :id 는 문자 그대로의 의미가 아닌 다른 값이 들어왔을 때, 그 값을 조회할 수 있다는 의미이다.
** 단, 일반 라우터보다 뒤에 위치해서 사용해야 한다. 그래야 다른 라우터를 방해하지 않는다.
익스프레스의 req, res객체는 http 모듈의 req, res 객체를 확장한 것이다. 기존 http 모듈의 메서드도 사용할 수 있고, 익스프레스가 추가한 메서드나 속성을 사용할 수 있다.
익스프레스의 메서드가 편리해서 잘 안쓰지만 여기서는 사용하는 http 모듈의 메서드