똑같은 삽질은 2번 하지 말자

(Node.js) body_parser 모듈 본문

Node

(Node.js) body_parser 모듈

곽빵 2019. 9. 30. 14:24

1. http 내장모듈만 쓰는 것과 뭐가 틀린가?

http모듈로만 post body를 파싱하려면, (post 방식으로 요청이 들어올때 그 내용을 parsing 하는것입니다.)

req.on('data', function(chunk) { body += chunk; }); 

와 같이 이벤트를 등록해야한다. 그다음에 인코딩처리를 해줘야한다.

그치만, body-parser를 쓰면 bodyParser.urlencoded()를 등록하면, 자동으로 req에 body속성이 추가되고 저장된다. 만약 urls에 접근하고싶다면, req.body.urls이다. 인코딩도 default로 UTF-8로 해준다. 이벤트등록할 필요 자체가 사라진다.

var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({
    extended: false
}));

 

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() 등이 사용가능해진다.



Comments