Node.js 입문기7 - Express 미들웨어

전클로네·2021년 1월 9일
0

Node.js

목록 보기
5/9

미들웨어는 익스프레스의 핵심입니다. 요청과 응답의 중간에 위치하여 미들(Middle)웨어 라고 부릅니다.
미들웨어는 요청과 응답을 조작하여 기능을 추가하거나 나쁜 요청을 걸러내기도 합니다.

미들웨어는 app.use(미들웨어)와 함께 사용됩니다.

const express = require("express");
const path = require("path");
const app = express();
app.set("port", process.env.Port || 3000);
app.use((req, res, next) => {
  console.log("모든 요청에 다 실행됩니다.");
  next();
});
app.get("/", (req, res, next) => {
    console.log("GET / 요청시에만 실행됩니다.");
    next();
  }, (req, res) => {
    throw new Error("에러는 에러 처리로 미들웨어로 갑니다.");
  }
);
app.use((err, req, res, next) => {
  console.log(err);
  res.status(500).send(err.message);
});
app.listen(app.get("port"), () => {
  console.log(app.get("port"), "번 포트에서 대기중");
});

app.use 매개변수에는 res,req,next인 함수를 넣으면 됩니다. 미들웨어는 위에서 아래로 실행이 되며 요청과 응답 사이에 특별한 기능을 추가할 수 있습니다.

주소를 첫번째 인자로 넣어주지 않는다면 모든 요청에서 실행되고, 주소를 넣는다면 해당 url에서만 실행이 됩니다.


dotenv 패키지


관리해야할 비밀키가 있을때 .env파일을 만들어 키=값 의 형식으로 저장한뒤 dotenv모듈을 사용해서 불러올 수 있습니다.


미들웨어 패키지


지금부터 미들웨어 패키지를 알아보도록 하겠습니다.


1. morgan 미들웨어


morgan은 콘솔에서 확인할 수 있습니다.

http메소드 주소 http상태코드 응답속도 - 응답바이트
의 정보가 나옵니다.

morgan을 사용할려면 다음과 같이 입력합니다.

const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('dev'));

인수로는 dev이외에도 combinde, common, short, tiny등을 넣을 수 있습니다. 개발용으로는 dev, 배포 환겨에서는 combinde를 사용하는것을 추천합니다.


2. static 미들웨어


static미들웨어는 정적인 파일을 제공하는 라우터 역할을 합니다. 기본적으로 제공되어져 express 객체 안에서 꺼내 장착하면 됩니다.

const express = require('express');
const morgan = require('morgan');
const app = express();
app.use('요청경로', express.static('실제경로'));

함수의 인수로 정적 파일들이 담겨져 있는 폴더를 지정하면 됩니다.


3. body-parser 미들웨어


요청의 본문에 있는 데이터를 해석해서 req, body 객체로 만들어주는 미들웨어 입니다.
보통 폼데이터나 Ajax요청의 데이터를 처리합니다.
익스프레스 4.16.0버전 부터 내장되어 별도로 설치 할 필요가 없습니다.

하지만 버퍼나 텍스트요청을 처리할 필요가 없다면 body-parser 패키지를 설치합니다.

const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(express.json());
app.use(express.urlencoded({extended: false}));

주로 urlencoded 주소형식으로 데이터를 보냅니다. 데이터를 보내는 형태는 json입니다.


cookie-parser는 요청에 동봉된 쿠키를 해석해 req.cookies객체로 만듭니다.

const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(cookieParser(비밀키));

서명된 쿠키가 있는 경우 제공한 비밀키를 통해 해당 쿠키가 내 서버가 만든 쿠키임을 검증할 수 있습니다.

비밀키를 통해 만들어낸 서명을 쿠키 값 뒤에 붙힙니다.
ex> name=cookies.sign
이와 같이 서명된 쿠키는 res.cookies 대신 res.signedCookies객체에 들어갑니다.


5. express-session 미들웨어


세션관리용 미들웨어 입니다. 세션은 사용자 별로 req.session객체 안에 유지됩니다.

express.session은 세션 관리 시 클라이언트에 쿠키를 보냅니다. 안전하게 쿠키를 전송하려면 쿠키에 서명을 추가해야 하고, 쿠키를 서명하는데 secret의 값이 필요합니다.

cookie-parser의 secret과 같게 설정하는 것이 좋습니다.
세션쿠키의 이름은 name으로 정합니다.


6. 미들웨어의 특성 활용하기


미들웨어는 req, res, next를 매개변수로 가지는 함수(에러처리만 err,req,res,next를 가짐.)로서 app.use, app.get, app.post등으로 장착합니다.

특정한 주소의 요청에만 실행되게 하려면 첫번쨰 인수로 주소를 넣으면 됩니다.

정적파일을 제공할때는 next가 포함되어있지 않기 때문에 별도로 선언해 주어야 합니다.

Ex) res.send, res.sendFile, express.json, express.urlencoded 등

  • next함수에 인수를 넣을 수도 있습니다.
    route를 넣을 시 다음 라우터의 미들웨어로 이동합니다.
    그외의 인수를 넣을 경우엔 예외처리 미들웨어로 이동합니다.

  • req.data에 값을 넣어 미들웨어간에 데이터를 공유할수 있습니다. (단, 다른 미들웨어 겹치치 않게 주의해야합니다.)

    const express = require('express');
    const app = express();
    app.use((req,res,next) => {
    	req.data = "데이터넘기기";
        next();
    }, (req,res,next) => {
    	console.log(req.data);
        next();
    });
    

7. multer 미들웨어


※이번에 사용할 미들웨어는 사용법이 다소 까다로울 수 있습니다.

multer 미들웨어는 여러가지 파일들을 멀티파트 형식으로 업로드 할 때 사용합니다.

멀티파트 형식이란?
enctype이 multipart/form-data인 폼을 통해 업로드하는 데이터의 형식을 의미합니다.



참고자료
Node.js 교과서

profile
안녕하세요. 노드로 개발하는 마운틴러버 개발자 입니다.

0개의 댓글