일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Elk
- network
- effective
- Java
- 데이터통신
- AWS
- Static
- r
- spring
- Heap
- socket
- 네트워크
- git
- reactive
- libuv
- cache
- VCS
- NoSQL
- mybatis
- redis
- mongodb
- javascript
- github
- Lombok
- HTTP
- nodejs
- ajax
- Linux
- reactor
- html
- Today
- Total
빨간색코딩
body-parser 모듈 (urlencoded, extended 옵션) 본문
참조문서 : https://www.npmjs.com/package/body-parser
post로 요청된 body를 쉽게 추출할 수 있는 모듈이다. 추출된 결과는 request객체(IncomingMessage 타입)에 body 속성으로 저장된다. API문서보면 다양한 메소드들이 많지만, 여기서는 URL-encoded form body parser만 사용한다.
npm install body-parser
로 설치한다.
1. http 내장모듈만 쓰는 것과 뭐가 틀린가?
http모듈로만 post body를 파싱하려면, req.on('data', function(chunk) { body += chunk; });
와 같이 이벤트를 등록해야한다. 그다음에 인코딩처리를 해줘야한다.
그치만 body-parser를 쓰면 bodyParser.urlencoded()
를 등록하면, 자동으로 req에 body속성이 추가되고 저장된다. 만약 urls에 접근하고싶다면, req.body.urls이다. 인코딩도 default로 UTF-8로 해준다. 이벤트등록할 필요 자체가 사라진다.
2. urlencoded()의 옵션
만약 아무 옵션을 주지 않는다면, body-parser deprecated undefined extended: provide extended option 같은 문구가 뜬다.
문서를 보면, .use(bodyParser.urlencoded({ extended: true or false }));
로 쓰라고 한다. extended 는 중첩된 객체표현을 허용할지 말지를 정하는 것이다. 객체 안에 객체를 파싱할 수 있게하려면 true.
extended 옵션에 대해
내부적으로 true 를 하면 qs 모듈을 사용하고, false 면 query-string 모듈을 사용한다. 이 두 모듈간의 차이에서 중첩객체 파싱여부가 갈린다. 예제는 참조문서의 stackoverflow 에 잘 나와있다.
req.body.hasOwnProperty is not a function 이슈
express generator 등오로 express 프로젝트를 세팅하면, app.js 에서 app.use(express.urlencoded({extended: false}));
가 보인다.
위에서 언급했듯이, false면 querystring모듈을 사용하는데, querystring.parse는 object를 상속받지 않는다. 따라서 아래와 같은 이슈가 있을 수 있다.
Note: The object returned by the querystring.parse() method does not prototypically extend from the JavaScript Object. This means that the typical Object methods such as obj.toString(), obj.hasOwnProperty(), and others are not defined and will not work.
이를 해결하는 다양한 방법이 많겠지만, {extended: true}
를 하면 qs.parse를 사용하므로, object를 상속받게 할 수 있다. 따라서 toString()와 hasOwnProperty() 등이 사용가능해진다.
'node.js' 카테고리의 다른 글
nodejs 테스트 도구와 방법론 (테스트의 중요성, 전략, mocha, chai, sinon, istanbul, 유용한 팁) (4) | 2019.02.13 |
---|---|
ejs (문법, include, nodejs와 연동) (0) | 2018.06.26 |
nodejs의 내부 동작 원리 (libuv, 이벤트루프, 워커쓰레드, 비동기) (7) | 2018.04.20 |
V8 inspector을 이용한 디버깅 (0) | 2017.08.04 |
nodejs 메모리 누수 (0) | 2017.08.04 |