[TIL] 2020. 07. 25. Body-parser

달밤·2020년 7월 25일
1

TIL

목록 보기
81/110
post-thumbnail

오늘 배운 것

Body-parser

body-parser는 node.js의 parsing middleware다.

request로 들어오는 사용자 요청을 기존의 복잡한 방식없이 req.body으로 접근할 수 있게 한다.

Before Using Body-parser

  • 기본적으로 node.js에서는 사용자로부터 전달된 데이터는 Buffer의 형식으로 처리하게 된다.
  • 이는 이전에 써놓았던 Buffer 게시글에서 설명하듯 streaming하여 전달되는 데이터가 buffer에 저장되고 이를 처리할 수 있게 되는 것이다.
  • 따라서 Body-parser를 사용하지 않고 기본 node.js 그리고 express에서 req를 처리하고 위해서는 buffer를 파싱하는 과정이 필요했다.
  • 다음과 같이 말이다.
let express = require("express")
let app = express()

app.post("/", (req, res)=>{
	let body = []
	request.on('data', (chunk) => {
  		body.push(chunk)
    })
    .on('end', () => {
  		body = Buffer.concat(body).toString();
  		body = JSON.parse(body)
        console.log(body)
	});    
})

//스트림하는 데이터들을 처리하기 위해 request.on을 사용하였고,
//"data"이벤트에서 사용되는 chunk는 그 값이 Buffer의 형식으로 들어오게된다.
//또 "end"이벤트에서 버퍼들을 다시 JS 객체로 파싱하는 과정을 거치고 나서야
//비로소 body라는 변수에 담긴 데이터를 JS 객체로 사용할 수 있게 된다.
  • 단순히 데이터를 받는 것에 불과한데도 코드가 길어지고, 가독성도 떨어지는 것 같다.
  • 조금 더 쉽게 데이터를 받을 수 있는 방법은 없을까?

Using Body-parser

  • Body-parser 미들웨어를 사용하면 위의 복잡한 과정없이 req.body로 바로 데이터에 접근할 수 있다.
let express = require("express")
let parser = require("body-parser")

let app = express()

app.use(parser.json())

app.post("/", (req, res)=>{
	console.log(req.body)
    })

//app.use(parser.json())을 이용해 JSON형식을 자바스크립트 객체로 파싱해주고있다.
//app.post 내에서는 req.body로 데이터에 접근이 가능하다.
  • 엄청나게 간단해졌다.

  • 하지만 Express v4.16.0 기준으로 body-parser 미들웨어를 따로 설치하지 않아도 사용할 수 있게 되었다. 출처: [ express 공식문서]

  • 사용 방법은 아래와 같다.

let express = require("express")

let app = express()

app.use(express.json())

app.post("/", (req, res)=>{
	console.log(req.body)
    })

//body-parser를 사용하기 전과 비교해보자. 크....

번외

  • 생각해보면 당연한건데 몰라서 몇 시간동안 삽질하다 알아낸 것
    • body-parser 미들웨어를 사용하게되면 req.on을 더 이상 사용할 수 없다!!!!
    • app.use(parser.json()) 부분에서 요청한 데이터가 파싱이 된다.
    • 따라서 아래에 있는 app.post()에서는 req.on을 사용하더라도 받을 데이터가 이미 파싱되고 난 이후이기 때문에 아무런 이벤트도 처리할 수 없게 되는 것이다.
    • 어제 이것을 몰라서 ㅋㅋㅋㅋ 왜 req.on안에 코드들이 작동을 안하냐며 울부짖었던 기억이....
  • body-parser를 공부하고 나니 다시는 req.on을 사용할 필요가 없게 되었다. 불편쓰.
profile
다 늦은 밤, 달밤의 개발일기

0개의 댓글