Node.js

express.json() 미들웨어

언젠간코딩잘함 2023. 4. 5. 13:36

미들웨어(Middleware)

미들웨어(Middleware)는 자동차 공장의 공정과 비슷하다. 컨베이어 벨트 위에 올라가 있는 요청(Request)에 필요한 기능을 더하거나, 문제가 발견된 불량품을 걷어내는 역할을 한다. 미들웨어는 express의 가장 큰 장점이라고 할 수 있다.

 

미들웨어를 사용하는 상황

 

  1.  POST 요청 등에 포함된 body(payload)를 구조화 할 때(쉽게 얻어내고자 할 때)
  2.  모든 요청/응답에 CORS 헤더를 붙여야 할 때
  3.  모든 요청에 대해 url이나 메서드를 확인할 때
  4.  요청 헤더에 사용자 인증 정보가 담겨있는지  확인할 때

 

미들웨어를 이용하면 Node.js 만으로 구현한 서버에서는 번거로울 수 있는 작업을 보다 쉽게 적용할 수 있다.

 

 


Express 설치

 

npm install express

 

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

 

 


case 1: POST 요청 등에 포함된 body(payload)를 구조화할 때

Node.js로 HTTP body(payload)를 받을 때는  Buffer를 조합해서 복잡한 방식으로 body를 얻을 수 있다.

네트워크상의 chunk를 합치고, Buffer를 문자열로 변환하는 작업이 필요하다.

 

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // body 변수에는 문자열 형태로 payload가 담겨져 있습니다.
});

Node.js로 HTTP 요청 body를 받는 코드

 

 

 

body-parser 미들웨어를 사용하면 이 과정을 간단하게 처리할 수 있다.

 

npm install body-parser

 

const bodyParser = require('body-parser');
const jsonParser = bodyParser.json();

// 생략
app.post('/users', jsonParser, function (req, res) {

})

npm으로 body-parser를 설치, 이용한 코드

 

 

 

Express v4.16.0 부터는 Express 내장 미들웨어인 express.json()을 사용한다.

 

const jsonParser = express.json();

// 생략
app.post('/api/users', jsonParser, function (req, res) {

})

express.json()을 이용한 코드

 

 

express.json()

express.json() 미들웨어는 Express 애플리케이션에서 JSON 형식의 요청(body)을 파싱하기 위해 사용되는 미들웨어이다. options 매개변수를 통해 파싱 동작을 세부적으로 제어할 수 있다.

 

const jsonParser = express.json({strict: false});

// 생략
app.post('/api/users', jsonParser, function (req, res) {

})

options에 {strict: false}를 추가한 이유는 무엇일까?

 

 

options로 전달된 {strict: false}는 strict mode를 비활성화 하여 JSON 파싱이 유연하게 이루어지게 합니다. 예를 들어, JSON 요청에 부가적인 white space나 라인 끝에 있는 쉼표와 같은 유효하지 않은 JSON 형식이 포함되어 있어도, 요청이 파싱되고 JSON 객체가 생성된다.

 

기본적으로 Express의 json() 미들웨어는 strict mode가 활성화되어, 유효하지 않은 JSON 형식이 포함되어 있는 경우엔 에러를 발생시킨다. 따라서 {strict: false} 옵션을 사용해 strict mode를 비활성화하여 에러없이 JSON을 파싱할 수 있다. 그러나 이는 보안에 주의가 필요하며, 신뢰할 수 없는 요청의 경우에 사용을 피해야 한다.

 

 

 

case 2: 모든 요청/응답에 CORS 헤더를 붙일 때

 

Node.js HTTP 모듈을 이용한 코드에 CORS 헤더를 붙이려면 writeHead 메서드를 이용할 수 있다. Node.js 에서는 이 메서드 등을 이용해 라우팅마다 헤더를 매번 넣어주어야 하고, OPTIONS 메서드에 대한 라우팅도 따로 구현해야 한다.

 

cors 미들웨어를 사용하면 이 과정을 간단하게 처리할 수 있다.

 

npm install cors

 

// 모든 요청에 대해 CORS 허용
const cors = require('cors');

// 생략
app.use(cors());

// 특정 요청에 대해 CORS 허용
const cors = require('cors')

// 생략
app.get('/products/:id', cors(), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for a Single Route'})
})

 

 

 

case 3: 모든 요청에 대해 url이나 메서드를 확인할  때

case 4: 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때