요청 데이터를 처리하는 Express 미들웨어 json, urlencoded, text, raw에 대해 알아보겠습니다.
Request Payload
Express의 내장 미들웨어
body-parser
를 기반으로 하는 기능- 클라이언트에서 Express 서버로 전송하는 요청에 데이터를 넣는 경우(POST 요청 등)
- 요청의 페이로드를 서버에서 구문 분석하기 위해 사용
- 해당 기능을 사용하지 않으면
req.body
의 값은 undefined
가 됨
1
2
3
4
5
6
7
8
9
| import express from "express";
const app = express();
// ...
app.post(API_URL, (req, res) => {
console.log(req.body); // undefined
});
|
Middleware
공통 서비스 및 기능을 애플리케이션에 제공하여 개발자와 운영자가 애플리케이션을 더욱 효율적으로 구축하고 배포하도록 돕는 소프트웨어
Payload
- 전송되는 순수한 데이터를 뜻함
- 전송의 근본적인 목적이 되는 데이터의 일부분
- 그 데이터와 함께 전송되는 헤더와 메타데이터와 같은 부분은 제외
1
2
3
4
5
6
| {
"status": "OK",
"data": {
"message": "Hello, world!"
}
}
|
- 페이로드는 메시지 프로토콜(message protocols) 중에 프로토콜 오버헤드(protocol overhead)와 원하는 데이터를 구별할 때 사용
"Hello, world!"
가 클라이언트가 관심을 가지는 페이로드
MIME 타입
- 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘
- 각 문서와 함께 올바른 MIME 타입을 전송하도록 서버가 정확히 설정하는 것이 중요
type/subtype
으로 표현- 대소문자를 구분하지 않지만 전통적으로 소문자를 사용
text/plain
, text/html
, image/png
, application/json
, application/octet-stream
, multipart/form-data
등
1. express.json()
1
| express.json([options]);
|
Content-Type
헤더와 type
옵션이 일치하는 요청만 처리- JSON만 파싱하는 미들웨어를 리턴
1
2
3
4
5
6
7
8
9
10
11
12
13
| // Client.js
fetch("/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
user: { username: "Test", email: "test@example.com" }
})
});
// Server.js
app.use(express.json());
app.post("/", function (req, res) {
const { username, email } = req.body.user;
});
|
2. express.urlencoded()
1
| express.urlencoded([options]);
|
Content-Type
헤더와 type
옵션이 일치하는 요청만 처리- urlencoded된 body만 파싱하는 미들웨어를 리턴
1
2
3
4
5
| <form method="POST" action="/">
<input type="text" name="user[username]" />
<input type="email" name="user[email]" />
<input type="submit" value="submit" />
</form>
|
1
2
3
4
| app.use(express.urlencoded());
app.post("/", function (req, res) {
const { username, email } = req.body.user;
});
|
form 태그의 Content-Type
application/x-www-form-urlencoded
&
으로 분리되고, =
기호로 값과 키를 연결하는 key-value tuple로 인코딩되는 값- HTML
form
태그의 enctype
속성을 따로 명시하지 않으면 기본값으로 설정됨
multipart/form-data
- 모든 문자를 인코딩하지 않음
- 파일, 이미지를 서버로 전송할 때 주로 사용
text/plain
- 공백 문자(space)는
+
로 변환 - 나머지 문자는 모두 인코딩하지 않음
3. express.text()
1
| express.text([option]);
|
Content-Type
헤더와 type
옵션이 일치하는 요청만 처리- 문자열만 파싱하는 미들웨어를 리턴
4. express.raw()
Content-Type
헤더와 type
옵션이 일치하는 요청만 처리- Buffer만 파싱하는 미들웨어를 리턴
참고
express()
express.js 에서 POST 데이터 처리하기
페이로드 (컴퓨팅)
MIME 타입
POST
HTTP: Content-Type 에 대해 알아보자
HTTP multipart/form-data 란?