과거에는 body-parser 모듈을 설치해 json() 메소드를 호출하여 body값 파싱을 하였는데 v4.16.0 기준 버전부턴 Express body-parser 모듈이 내장되어 있다.
❓ 그래서 왜 사용하는 것이야?
클라이언트에서 POST request를 보내면 요청 데이터가 req.body 객체에 담겨서 전달되는데 이 때 express.json()을 사용하지 않고 값을 출력하게 되면 undefined가 반환된다.
body-parser 미들웨어 express.json() 사용 전
import express from "express";
const app = express();
app.post("/login", (req, res, next) => {
try {
console.log("req.body:", req.body);
res.send("login route");
} catch (error) {
res.json(400, { message: "An error occured!", error });
}
});
위 코드의 결과는..?
때문에 이 값을 서버에서 그대로 사용이 불가능하고 해석 가능한 형태로 변환해야 하는데 body 값을 파싱하는 역할을 수행하는 것이 body-parser 미들웨어이다. (multipart/form-data 같은 폼을 통해 전송된 데이터는 해석하지 못한다)
body-parser 미들웨어 express.json() 사용 후
import express from "express";
const app = express();
app.use(express.json());
app.post("/login", (req, res, next) => {
try {
console.log("req.body:", req.body);
res.send("login route");
} catch (error) {
res.json(400, { message: "An error occured!", error });
}
});
body 값을 잘 가져온다!
📌 urlencoded({ extended: boolean })
추가적으로 express.json()은 application/json 방식의 Content-Type 데이터를 받아주고, express.urlencoded({ extended:boolean }) 은 application/x-www-form-urlencoded 방식의 Content-Type 데이터를 받아준다 (html form 태그를 사용하여 POST방식으로 요청하거나 jQuery의 AJAX 요청을 할 때 default Content-Type은 application/x-www-form-urlencoded 이다)
Content-Type: application/x-www-form-urlencoded
→ key=value&key=value 형식으로 요청이 간다.
req.body 값을 보면?
Content-Type: application/json
→ json 형식으로 요청이 간다.
req.body 값을 보면?
각 Content-Type 형식으로 요청했을 때 req.body에 담긴 결과값의 형태는 동일하다. (단, 정수형 타입으로 데이터를 받을려면 Content-Type을 application/json 형식으로 사용하자)
❓ urlencoded 함수의 인자로 넘겨주는 { extended: boolean } 은 뭐지?
extended 옵션을 사용하지 않으면 터미널에 body-parser deprecated undefined extended: provide extended option 메시지가 출력된다. extended 옵션을 false로 설정하면 querystring 라이브러리를 사용하고, true로 설정하면 qs 라이브러리를 사용한다. 즉, 데이터를 *인코딩하는 방식을 선택하는 옵션으로 중첩된 객체 처리를 허용할지 말지 결정한다.
💡 인코딩(encoding)은 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식을 말한다.
qs 라이브러리
쿼리스트링으로 부터 중첩된 객체를 만들 수 있다.
var qs = require("qs")
var result = qs.parse("person[name]=bobby&person[age]=3")
console.log(result) // { person: { name: 'bobby', age: '3' } }
querystring 라이브러리
쿼리스트링으로 부터 중첩된 객체 생성을 지원하지 않는다.
var queryString = require("query-string")
var result = queryString.parse("person[name]=bobby&person[age]=3")
console.log(result) // { 'person[age]': '3', 'person[name]': 'bobby' }
자세한 것은 관련 링크 참고!
참고 링크
https://blog.naver.com/prologue/PrologueList.naver?blogId=writer0713
'Programming > Node.js' 카테고리의 다른 글
[MongoDB] mongoose.connection.on() & once() (0) | 2021.10.13 |
---|---|
[Express.js] middleware란?? (0) | 2021.10.01 |
Node.js 교과서 express 미들웨어 (0) | 2020.11.27 |
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 Node.js part2 (0) | 2020.09.17 |
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 Node.js part1 (0) | 2020.09.11 |