express.urlencoded() 어디에 사용될까?
최근 새로운 Express 프로젝트를 구성하면서 꽤나 애를 먹은 옵션이 있다.
app.use(express.urlencoded({extended: true}));
Plain Text
복사
위 옵션을 선언하지 않아 클라이언트로부터 데이터를 받아오지 못하는 현상이 있었다.
왜 urlencoded를 선언하지 않으면 문제가 생겼던 걸까?
아래는 문제의 클라이언트의 소스이다.
this.$dom.find('.submit').click(function() {
$.post('/api/submit', {
input: JSON.stringify(that.problemStubs.map(function(ps) {
console.log(ps)
return {
id: ps.data.id,
answer: ps.answerObjUser.getAnswer()
};
}))
}, function(data) {
that._renderResult(data.results);
that.$dom.find('.submit').attr('disabled', true);
});
});
Plain Text
복사
Jquery를 활용한 Post 데이터를 전달하고 있고, input key-value 형태의 값을 전달하고 있다.
자연스럽게 req.body.input 형태로 전달받고자 하여 요청을 받았으나 undefined가 발생한다.
JSON 형태의 값을 받아오지 못하는 것 같아 옵션을 확인해본다.
app.express.json()
Plain Text
복사
해당 옵션은 이미 선언되어 있었으나 어째선지 input이라는 key값 조차 출력되지 않았다.
이 문제는 application/x-www-form-urlencoded 형식으로 보내지는 데이터에 대해서는 다른 미들웨어를 사용해야 한다는 점이다.
application/x-www-form-urlencoded란 데이터를 key와 value의 쌍의 문자열 형태로 만들어주는 방식으로 데이터를 전달하게 된다.
이 데이터 방식을 파싱하기 위해서는 urlencoded 미들웨어를 사용해야한다.
자세한 부분은 프로젝트가 마무리되는대로 서술하도록 한다.