이번 아티클에서는 미들웨어 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')로 스트림을 사용해야 했습니다.
하지만 body-parser를 사용하면 이 패키지가 내부적으로 스트림을 처리해 req.body에 추가해 줍니다. JSON 방식으로 { name: 'johndoe', book: 'nodejs' } 를 본문으로 보내면 req.body에 그대로 들어갑니다. 만일 URL-encoded 방식으로 name=johndoe&book=nodejs를 본문으로 보내면, req.body에 { name: 'johndoe', book: 'nodejs' }가 들어가게 됩니다.
'Programming > Node.js' 카테고리의 다른 글
7. 익스프레스 (1) - 미들웨어 [7] : express-session 1 (1) | 2024.08.31 |
---|---|
7. 익스프레스 (1) - 미들웨어 [6] : cookie-parser (0) | 2024.08.29 |
7. 익스프레스 (1) - 미들웨어 [4] : static (0) | 2024.08.27 |
7. 익스프레스 (1) - 미들웨어 [3] : morgan (1) | 2024.08.26 |
7. 익스프레스 (1) - 미들웨어 [2] : 다양한 미들웨어 적용하기 (0) | 2024.08.25 |