공부/노드

express 미들웨어

야옹아옹 2021. 6. 23. 23:29

미들웨어란?

요청(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 교과서