Node.js - express (11) express.json()

2022. 2. 15. 15:49·Node/Express
반응형

 

 

이번 포스팅에서는 서버쪽에서 JSON 형태의 데이터를 받는 방법에 대해 알아보고자 한다. WSL 환경에서 curl을 이용해 post 요청으로 데이터를 전달하는 방식으로 진행하였다.

 

지금까지 우리는 post 방식으로 전달된 데이터를 받을 때 아래의 코드를 사용했었다.

app.use(express.urlencoded({extended: true}))

해당 코드를 작성해 줌으로써 라우터의 미들웨어에서 req.body를 사용해 HTTP 패킷의 Request Body 영역에 담겨 있는 데이터를 가져올 수 있었다. 하지만 이 코드는 body 영역에 담겨있는 모든 데이터를 처리할 수 있는 마법의 구문이 아니다. body 영역에 데이터가 있을 때마다 이 코드가 실행되는 것이 아니라, 요청 헤더(Request Headers)에서 "Content-type: application/x-www-form-urlencoded" 일 경우에만 실행되는 것이다.  

 

Content-type이 "application/x-www-form-urlencoded"라는 것은 HTTP 패킷의 body 영역에 존재하는 데이터가 queryString 형태의 데이터일 때 해당 데이터를 처리할 수 있다는 의미이다.

 

하지만 웹서버가 전달받는 데이터의 형태가 queryString만 있는 것은 아니다. 많은 경우, JSON 형태로 데이터들이 전달된다. JSON 형태의 데이터는 요청 헤더에 "Content-type: application/json" 으로 되어있기 때문에 앞서 작성한 코드를 통해 데이터를 처리하는 것이 불가능하다.  JSON 형태의 데이터를 처리하기 위해서는 아래의 코드를 사용해줘야만 한다.

app.use(express.json())

 

실제로 어떤식으로 처리가 되는지 코드를 살펴보도록 하자.

// server.js 파일

const express = require('express')
const app = express()

app.use(express.urlencoded({extended: true}))

app.post('/', (req, res)=>{
    console.log(req.headers)
    let text = JSON.stringify(req.body)
    // JSON 데이터 타입을 String으로
    res.send(`hello ${text}`)
})

app.listen(3001, ()=>{
    console.log('server onload')
})

app.use(express.json( ))을 사용하지 않은 상태에서 다음과 같이 wsl의 curl을 이용해 post 방식의 요청을 보내보았다. (참고로 curl은 cli 방식으로 서버에 요청을 보낼 수 있는 리눅스 명령어이다.)

< queryString 형태 >

curl -X POST \
-d "name=ingoo&subject=hi&content=내용" \
-H "Content-type:application/x-www-form-urlencoded" \
http://localhost:3001/

console.log(req.headers)

데이터 타입이 queryString 형태이고 요청 헤더의 내용이 "Content-type:application/x-www-form-urlencoded" 일 때 데이터를 잘 받아온 것을 확인할 수 있다. 

 

 

이제 데이터 타입을 JSON으로 변경해서 요청을 보내보도록 하자.

< JSON 형태 >

curl -X POST \
-d '{"name":"ingoo", "subject":"hi", "content":"내용"}' \
-H "Content-type:application/json" \
http://localhost:3001/

console.log(req.headers)

보이는 것과 같이 빈 객체가 전달된 것을 확인할 수 있다. JSON 타입으로 데이터를 전달했지만 server.js 파일 안에는 JSON 타입의 데이터를 전달받을 수 있는 코드가 존재하고 있지 않기 때문이다. 

app.use(express.json())

server.js 파일 안에 해당 코드를 추가해서 JSON 타입의 데이터를 처리할 수 있도록 하자.

 

더 이상 빈 객체가 전달되지 않는 것을 확인할 수 있다.

 

HTTP 패킷의 body 영역에 담겨있는 데이터는 그 형태가 다양하다. queryString 형태일 수도 있고 JSON 형태일 수도 있다. 또는 이 두가지의 데이터 포맷이 아닌 다른 형태의 데이터 포맷으로 전달될 수도 있다. 어떠한 데이터 포맷으로 데이터를 전달받는지에 따라 알맞은 처리를 해주는 작업이 수반되어야 함을 유의하도록 하자.

app.use(express.urlencoded({extended: true}))
// queryString 형태의 데이터 처리

app.use(express.json())
// JSON 타입의 데이터 처리

 

 

 

 

 

 

반응형

'Node > Express' 카테고리의 다른 글

Node.js - express (13) JWT 로그인 인증  (0) 2022.03.05
Node.js - express (12) Buffer , Hash , JWT  (0) 2022.03.03
Node.js - express (10) express-session 사용하기  (2) 2022.02.12
Node.js - express (9) express.Router() 사용하기  (0) 2022.02.10
Node.js - express (8) 라우터와 미들웨어 (router & middleware)  (0) 2022.02.10
'Node/Express' 카테고리의 다른 글
  • Node.js - express (13) JWT 로그인 인증
  • Node.js - express (12) Buffer , Hash , JWT
  • Node.js - express (10) express-session 사용하기
  • Node.js - express (9) express.Router() 사용하기
bitkunst
bitkunst
Ever tried, Ever failed, No matter. Try again, Fail again, Fail better.
  • bitkunst
    THE DEVELOPER
    bitkunst
  • 전체
    오늘
    어제
  • bitkunst GitHub
    • 분류 전체보기 (154)
      • Setup (1)
      • HTML (7)
      • CSS (10)
      • Go (2)
      • JavaScript (14)
      • TypeScript (3)
      • Node (34)
        • Node.js (7)
        • Express (19)
        • NestJS (8)
      • React (19)
      • MySQL (6)
      • BlockChain (14)
      • Ethereum (20)
      • AWS (5)
      • Linux (2)
      • Infra (2)
        • Docker (2)
      • Testing (2)
      • ABOUT CS (11)
      • 토이 프로젝트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    AWS EC2
    블록체인 지갑 서버 만들기
    JavaScript
    타입스크립트 블록 체인
    css
    html
    Nest
    redux
    이더리움
    TypeScript Blockchain
    타입스크립트로 블록 체인 만들기
    블록체인 트랜잭션 만들기
    Blockchain
    프론트엔드
    웹
    이더리움 스마트 컨트랙트
    Nodejs
    타입스크립트로 블록체인 만들기
    CSS Style
    AWS
    nestJS
    자바스크립트
    React
    블록체인
    nodejs mysql
    타입스크립트 블록체인 만들기
    Ethereum
    웹개발
    웹프론트엔드
    리액트
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
bitkunst
Node.js - express (11) express.json()
상단으로

티스토리툴바