본문 바로가기
공부/노드

express 미들웨어

by 야옹아옹 2021. 6. 23.

미들웨어란?

요청(req)응답(res)중간(미들)에 위치하여 특정 기능을 수행한다.

라우터와 에러 핸들러 또한 미들웨어의 일종이다.

미들웨어는 요청과 응답을 조작기능을 추가하기도 하며 나쁜 요청을 걸러내기도 한다.

app.use( 미들웨어 )

미들웨어는 app.use와 함께 사용한다.

// 미들웨어 사용해보기
app.use((req, res, next) => {
  console.log('모든 요청에서 실행된다.');
  next(); // next를 해야 다음 일을 하기위해 넘어간다.
});

localhost:3000를 호출하면 미들웨어도 실행된다.

반드시, next( )를 미들웨어 마지막에 써줘야한다. next를 실행하지 않으면 다음으로 넘어갈 수 없다.

app.use( [, 경로 ] ,미들웨어 )

app.use([, 경로 ] ,미들웨어 )로 특정 경로 요청에서만 미들웨어가 실행되게 할 수 있다.

미들웨어를 여러 개 장착할 수도 있다.

app.get(
  '/',
  (req, res, next) => {
    // 미들웨어를 여러개 넣을 수 있다.
    console.log('GET 요청에서만 실행되는 미들웨어');
    next(); // next를 꼭 써줘야한다.
  },
  (req, res) => {
    throw new Error('에러는 에러 처리 미들웨어로..'); // err.message
  }
);

app.get( 경로 , 미들웨어 , 콜백 함수 )

app.use뿐만 아니라 app.get이나 app.post중간에 미들웨어를 넣어 사용할 수도 있다.

에러처리 미들웨어

에러처리 미들웨어매개변수 (err, req, res, next) 로 총 네 개를 가지고 있다. 반드시 네 개여야한다. 

err 에러에 관한 정보가 담겨있다. 

// 에러 처리 미들웨어
app.use((err, req, res, next) => {
  console.error(err);
  res.status(500).send(err.message);
});

res.status( HTTP 상태 코드)로 직접 상태코드를 지정할 수 있다.


🎶 여러 미들웨어 패키지

다운받은 패키지들은 app.use( 패키지 )로 사용할 수 있다. 

매개변수인 (req,res,next)가 없는 이유는 미들웨어 내부에 이미 들어있기 때문이다.

morgan

요청응답에 대한 정보콘솔기록한다. 콘솔은 노드쪽 콘솔이다.

사용방법

app.use(morgan( '인수' ));
app.use(morgan( 'dev' ));

인수에 따라 다른 로그 정보를 콘솔에 기록한다.

dev인수는 개발 환경에서 사용하고, 배포 환경에서는 combined를 사용한다. 

 

static

정적인 파일들을 제공하는 라우터 역할을 한다. 노드 기본 제공이기 때문에 설치할 필요가 없다.

사용방법

// 정적인 파일들을 제공하는 라우터 역할
// localhost:3000/test.js
app.use(express.static('public'));

// localhost:3000/test/test.js
app.use('/static', express.static('public'));

express.static('실제 정적파일이 있는 경로')

express.static('경로 안에 폴더' ,'실제 정적파일이 있는 경로')

public 폴더 안에 test 폴더 안에 test.js 파일이 있다.
정적 파일에 접근할 수 있다.

body-parser

요청(req) 본문에 있는 데이터를 해석해서 req.body 객체로 만들어주는 미들웨어

멀티파트(이미지, 동영상, 파일) 데이터는 처리할 수없다.

사용방법

노드 4.16.0 버전부터 익스프레스에 내장되어서 따로 설치할 필요가없다. 

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

그러나, 내장 모듈은 JSONURL-encoded 형식의 데이터만 해석 할 수 있다.

Raw(요청 본문이 버퍼데이터)와 Text(텍스트 데이터)를 해석하고 싶으면 바디 파서를 따로 설치해야한다.

// 설치
// npm i body-parser
const bodyParser = require('body-parser');
app.use(bodyParser.raw());
app.use(bodyParser.text());

요청 데이터 종류

  • JSON - JSON 형식의 데이터 전달 방식
  • URL- encoded - 주소 형식으로 데이터를 보내는 방식. { extended :false }면 노드의 querystring모듈을 사용해 쿼리스트링을 해석하고, { extened: true }면 외부 모듈인 qs 모듈을 사용해 쿼리스트링을 해석한다. qs 모듈은 설치해야한다.
  • Raw - 버퍼 데이터
  • Text - 텍스트 데이터

 

cookie-parser

요청(req)에 동봉된 쿠키를 해석해서 req.cookies 객체로 만든다.

사용방법

// cookie-parser 쿠키를 해석해서 객체로 만든다
app.use(cookieParser(비밀키));
app.use(cookieParser(process.env.COOKIE_SECRET));

해석된 쿠키들은 req.cookies 객체에 들어간다.

비밀키를 통해 해당 쿠키가 서버에서 만든 쿠키임을 검증 할 수있다. 비밀키를 이용해 서명을 만들어 쿠키 값 뒤에 붙인다. 서명된 쿠키는 req.cookies 객체가 아닌 req.signedCookies객체에 들어있다.

express-session

세션 관리용 미들웨어이다. 세션은 사용자별req.session객체 안에서 유지된다.

사용하기

app.use(
  session({
    resave: false,
    saveUninitialized: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
      httpOnly: true,
      secure: false,
    },
    name: 'session-cookie',
  })
);

내부적으로 cookie-parser를 사용하고 있다. 인수로 세션에 대한 설정을 받는다.

인수들

  • resave - 요청이 올 때, 세션에 수정사항이 없더라도 세션을 다시 저장할지 설정
  • saveUninitialized - 세션에 저장할 내역이 없더라도 처음부터 세션을 생서알지 설정
  • secret - 쿠키를 서명하는데 필요한 키
  • cookie - 세션 쿠키에 대한 설정

 


Node.js 교과서

'공부 > 노드' 카테고리의 다른 글

jwt - req.headers.authorization이 undefined인 에러  (0) 2021.06.28
express - req와 res 객체  (1) 2021.06.24
express - 라우터  (0) 2021.06.24
express- multer  (0) 2021.06.24
express 시작하기  (1) 2021.06.23

댓글