본문 바로가기

Programming/Node.js

7. 익스프레스 (1) - 미들웨어 [5] : body-parser

node js logo image

 

 

 

 

이번 아티클에서는 미들웨어 body-parser에 대해서 살펴봅니다. 이는 req의 본문에 있는 데이터를 해석해서 req.body로 만들어 주는 미들웨어죠. 폼 데이터, AJAX 요청의 데이터를 처리합니다. 참고로 멀티파트(이미지, 동영상, 파일) 데이터는 처리가 불가능해서 향후 살펴볼 multer 모듈을 사용하게 됩니다. 

 

 

[app.js]

 

const express =require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);

app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded( {extended: false} ));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
    resave: false,
    saveUninitialized: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
        httpOnly: true,
        secure: false,
    },
    name: 'session-cookie',
}));

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.error(err);
    res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기');
});

 

 

위 예제에서 body-parser를 사용하는 방식은 아래 부분입니다. 익스프레스 4.17.0 버전부터는 body-parser가 내장되어 있어서 별도의 설치가 필요하지 않습니다. 

 

// JSON 형식 데이터 처리
app.use(express.json());
// URL-encoded 형식 데이터 처리
app.use(express.urlencoded({ extended: false }));


/* 추가 */
// 버퍼 데이터 처리
app.use(express.raw());
// 텍스트 데이터 처리
app.use(express.text());

 

 

위 케이스를 하나씩 짚어보겠습니다. 

 

1. JSON 방식일 경우, 말 그대로 JSON 형식의 데이터 전달 방식을 의미합니다. 

 

2. URL-encoded는 주소 형식으로 데이터를 전달하는 경우를 말합니다. form 전송은 주로 URL-encoded 방식을 사용합니다.특히 예제에 urlencoded 메서드에 { extended: false } 옵셜을 사용하는데, 이 옵션이 false이면 노드의 querystring 모듈을 사용해 쿼리스트링을 해석합니다. true이면 qs 모듈을 사용해 해석합니다(qs는 내장이 아닌 별도 npm)

 

 

body-parser를 사용하면 어떤 점이 좋을까요? 앞선 요청 처리 아티클에서 보면 POST와 PUT 요청의 본문을 전달받기 위해서는 req.on('data')와 req.on('end')로 스트림을 사용해야 했습니다. 

 

 

 

5. http 모듈로 서버 만들기 (2) - REST와 라우팅 [8]

앞선 아티클에서 작성한 restServer.js를 계속해서 살펴보겠습니다. 작성된 코드 중, PUT과 POST에 대해서 집중적으로 살펴보겠습니다.    5. http 모듈로 서버 만들기 (2) - REST와 라우팅 [7]우선 앞서

nozeroslope.tistory.com

 

 

하지만 body-parser를 사용하면 이 패키지가 내부적으로 스트림을 처리해 req.body에 추가해 줍니다. JSON 방식으로 { name: 'johndoe', book: 'nodejs' } 를 본문으로 보내면 req.body에 그대로 들어갑니다. 만일 URL-encoded 방식으로 name=johndoe&book=nodejs를 본문으로 보내면, req.body에 { name: 'johndoe', book: 'nodejs' }가 들어가게 됩니다.