node.js Express 서버에 요청으로 들어온 Body를 JSON형태로 읽기

 안녕하세요. 알렉스 입니다. 이번에는 Express를 이용해서 Client에서 들어온 request의 Body를 JSON형식으로 읽어보도록 하겠습니다.


const express = require('express')
const app = express();
// POST
app.post('/login', (req, res) => {
console.log(req.body) // body확인 가능 부분
res.status(201);
res.send({
message : "Login Successful",
body: req.body
})
})

app.listen(3500, ()=>{
console.log("Server is working");
})




위 코드와 사진을 확인하면 실제 Postman에서 request한 body내용이 전혀 읽혀지지 않은것이 확인이 됩니다. 이렇한 원인은 통신에 있습니다. http통신의 body는 한번에 들어오는 것이 아닙니다. 부분(또는 chunk) 부분 들어오고 그것을 조합하고 나야 완전한 body가 되는 것입니다.


app.use(function( req, res, next ) {
let data = '';
// chunk를 하나로 모음
req.on('data', function( chunk ) {
data += chunk;
console.log(chunk);
});

// chunk를 모으는 것이 끝남
req.on('end', function() {

// req.rawBody = data;

console.log( 'on end: ', data )
if (data && data.indexOf('{') > -1 ) {
req.body = JSON.parse(data);
}
next();
});
});

middleware로 위 코드를 POST시작 부분에 붙여주면 body가 출력됨을 알수 있습니다. 





실제 data는 여러개의 Buffer를 하나로 묶은 것이다. 그런데 Buffer에 있는 저 문자들이 무엇인지 궁금할 것이다. 그것은 ASCII code이다. Buffer 맨 앞에 7b는 16진수로 10진수로 변환하면 123이다. 그런데 ASCII code를 참고하면 '{'를 표현한다. 즉 이렇게 chunk를 모아서 하나의 data로 만든다. (ASCII code 모음을 문자열로 변환을 해준다)


 하지만 매번 이렇게 쓸수는 없다. 다행히 매우 간단한 방법이 있다. 

// 이 부분이 post의 body부분을 볼수 있게 해주는 부분 입니다.
// body부분을 json타입으로 변형 시켜 줍니다.
app.use(express.json());

middlewear를 이걸로 대체하면 된다. 위의 모든 과정은 원리를 설명하기 위한거고 한번에 압축한 것은 위 코드를 사용하면 된다.




아래 코드를 직접 작성해 보시기 바랍니다.

const express = require('express')
const app = express()
// 이 부분이 post의 body부분을 볼수 있게 해주는 부분 입니다.
// body부분을 json타입으로 변형 시켜 줍니다.
app.use(express.json());

// app.use(function( req, res, next ) {
// let data = '';
// // chunk를 하나로 모음
// req.on('data', function( chunk ) {
// data += chunk;
// console.log(chunk);
// });

// // chunk를 모으는 것이 끝남
// req.on('end', function() {

// // req.rawBody = data;

// console.log( 'on end: ', data )
// if (data && data.indexOf('{') > -1 ) {
// req.body = JSON.parse(data);
// }
// next();
// });
// });

// POST
app.post('/login', (req, res) => {
console.log(req.body) // body확인 가능 부분
res.status(201);
res.send({
message : "Login Successful",
body: req.body
})
})

app.listen(3500, ()=>{
console.log("Server is working");
})


댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)