dh_0e

[Node.js] 강의 내용 개념 정리(8) (미들웨어, joi, 에러 처리 미들웨어) 본문

내일배움캠프/Node.js[입문]

[Node.js] 강의 내용 개념 정리(8) (미들웨어, joi, 에러 처리 미들웨어)

dh_0e 2024. 5. 16. 01:03

미들웨어 (Middleware)

- 서버의 요청,응답 과정의 중간에 위치하여 특정 기능을 수행하는 함수

- 모든 요청에 대해서 로그를 남기거나 특정 사용자만 API를 접근하게 할 때 사용

- Form을 통해 전송한 데이터를 서버에서 파싱하여 사용할 수 있게끔 할 때 사용

 

Express.js의 미들웨어

- Express.js의 핵심 기능 중 하나로 다양한 기능을 제공

 

Body Parser: 서버에 전달 된 req.body를 읽어올 수 있게 해줌

app.use(express.json()); // json 형태로 서버에 body 데이터를 전달하면, req.body에 데이터를 변환하여 넣어준다.
app.use(express.urlencoded({ extended: true })); // form contents type에서 body 데이터를 전달하면, req.body에 데이터를 변환하여 넣어준다.

- json: JSON 규격의 body 데이터를 코드에서 사용할 수 있게끔 해줌

- urlencoded: form-urlencoded라는 규격의 body 데이터를 코드에서 사용할 수 있게끔 해줌

 

Express.js에서 미들웨어 작성

app.use((req, res, next) => {
  // 필요한 코드
});

req (Request)

- 요청에 대한 정보가 담겨있는 객체

- HTTP Headers, Query Parameters, URL 등 브라우저가 서버로 보내는 정보가 담겨있음

res (Response)

-응답을 위한 기능을 제공

- 어떤 HTTP 상태 코드로, 어떤 데이터 형식으로, 헤더는 어떤 값을 넣어 응답할 지 기능을 제공함

http 상태 코드 by ChatGPT

next

- 다음 스택으로 정의된 미들웨어를 호출

- 미들웨어는 순차적으로 진행하므로 다음 순서의 미들웨어를 실행함

res.send() or res.json()이 실행되면 다음 미들웨어를 실행하지 않음

 

 

Router와 미들웨어의 차이

- Router는 미들웨어 기반으로 구현된 객체이므로 미들웨어와 동일한 방식으로 작동

- Router는 미들웨어 함수를 특정 경로에 바인딩하는 역할을 하며, 요청이 들어온 URL 경로에 따라 서로 다른 미들웨어를 실행시킬 수 있게끔 해줌

by ChatGPT

 

Express.js의 미들웨어가 실행되는 경우

- app.use(Middleware): 모든 요청에서 미들웨어 실행됨

- app.use('/api', Middleware): /api로 시작하는 모든 요청에서 미들웨어 실행

- app.post('/api', Middleware, (req, res) => {}): /api로 시작하는 POST 요청에서 미들웨어를 실행함

 

joi

- JavaScript 유효성 검증 라이브러리

- 유효성 검증에 실패하면 오류를 발생시킴

ex)

import Joi from 'joi';

// Joi 스키마를 정의합니다.
const schema = Joi.object({
  name: Joi.string().min(3).max(30).required(),
  // 문자열은 최소 3글자, 최대 30글자로 정의합니다.
  // name Key는 문자열 타입이고, 필수로 존재해야합니다.
});

// 검증할 데이터를 정의합니다.
const user = { name: 'Foo Bar' };

// schema를 이용해 user 데이터를 검증합니다.
const validation = schema.validate(user);

// 검증 결과값 중 error가 존재한다면 에러 메시지를 출력합니다.
if (validation.error) {
  console.log(validation.error.message);
} else {
  // 검증 결과값 중 error가 존재하지 않는다면, 데이터가 유효하다는 메시지를 출력합니다.
  console.log('Valid Data!');
}

 

validate() vs validateAsync()

- validate() 유효성 검사를 비동기적으로 검증하기 위해 validateAsync()가 사용됨

 

에러 처리 미들웨어

- 원하지 않았던 비즈니스 로직이 수행되지 않도록 하기 위해 사용됨

- 에러 처리 미들웨어는 Express.js가 공식적으로 제공하는 기능

 

다음과 같이 4개의 인자를 가진 미들웨어는 에러 처리 미들웨어임

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

err: 이전 미들웨어에서 발생한 에러를 전달받은 객체

- 에러를 인자로 받아 클라이언트에게 에러 응답을 반환하거나 다음 미들웨어로 에러를 전달하는 역할을 담당

- Nest.js 프레임워크에서 Exception Filter라는 이름으로 불림

 

 

  Express.js 에러 발생 시

Experss.js에서는 미들웨어나 라우터에서 에러가 발생하면, 해당 에러를 next 함수를 통해 다음 미들웨어로 전달함.
그리고, Express.js는 등록된 미들웨어 중에서 에러를 매개변수로 받는 에러 처리 미들웨어를 찾아 실행

 

 

에러 처리 미들웨어를 Router 하단에 등록하는 이유

미들웨어는 등록된 순서대로 실행되므로 라우터 이전에 에러 처리 미들웨어를 등록하면 라우터에서 발생한 에러를 처리할 수 없게 된다. 라우터에서 발생한 에러는 라우터 이후에 등록된 미들웨어로 전달되기 때문.

 

정리

by ChatGPT