Express; req.params vs. req.body

Daye Kang·2020년 5월 24일
15

Node JS로 api를 짜던 와중에 req.paramsreq.body의 차이가 궁금해서 쓰는 글.

Request object

req.paramsreq.body 둘 다 request 프로퍼티에 해당한다.

그렇다면 express에서 request는 정확히 어떤 것일까?

공식문서에 따르면,

'HTTP request'로써 'req'로 표현되는 객체이다. request 'query string', 'parameters, 'body', 'HTTP header' 등의 프로퍼티를 갖는다. 'req'객체는 'Node'의 request 객체보다 향상된 버전이다.

'req' 객체에는 다양한 프로퍼티가 있지만 그 중에서 req.paramsreq.body, 그리고 req.query 위주로 살펴보겠다.

req.params

// @route    GET api/posts/:id
// @desc     'get' 메소드를 써서 파라미터 프로퍼티인 id값에 맞는 포스트를 가져오는 요청

router.get("/:id", auth, async (req, res) => { // 'id'라는 프로퍼티
  try {
    const post = await Post.findById(req.params.id);
    res.json(post);
  } catch (err) {
    res.status(500).send("Server Error");
  }
});

'api/posts/:id'라는 라우터 경로가 있을 때, 'id'는 'req.params.id'로 불러올 수 있다.
req 객체에 'parameter'라는 프로퍼티가 있고, 그 프로퍼티의 'id'라는 프로퍼티로 접근해 요청을 보낼 수 있는 것.

'5ec226e7ea65bf4834ed1738'라는 id 값을 값으로 넣어 요청을 했을 때 성공적으로 해당 id의 포스트 데이터가 응답이 옴.

req.query

req.query는 해당 라우트 경로에서 각각의 'query string'을 파라미터로 갖는 객체 프로퍼티이다. 만약 'query parser'가 값이 없으면 빈 객체가 나올 것이고, 그렇지 않으면 해당에 맞는 'query parser'가 나올 것.

// GET /search?q=tobi+ferret
console.dir(req.query.q)
// '/search'라는 라우트 경로에서 query.q에 해당하는 값은 'tobi ferret'
// => 'tobi ferret'

// GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
console.dir(req.query.order)
// '/shoes'라는 라우트 경로에서 query.order에 해당하는 값은 'desc'
// => 'desc'

console.dir(req.query.shoe.color)
// '/shoes'라는 라우트 경로에서 query.shoe.color에 해당하는 값은 'blue'
// => 'blue'

console.dir(req.query.shoe.type)
// '/shoes'라는 라우트 경로에서 query.shoe.type에 해당하는 값은 'converse'
// => 'converse'

req.query의 형태는 사용자의 임의에 따라 결정되므로 그 해당 객체의 프로퍼티와 값을 신뢰하기 전에 타당한 것인지 입증되어야 한다. 예를 들어 'req.query.foo.toString()'은 여러 이유에서 입증이 실패될 수 있다. 'foo'가 없을 수도 있고 string이 아닐 수도 있으며, toString'은 function이 아닌 string일 수 있는 것이다.

req.body

'request body'에 'key-value'의 데이터가 담긴 객체 프로퍼티이다. JSON 객체에 접근 가능하다.

// POST https://swamp.com/login
//
//      {
//        "email": "sam@gmail.com",
//        "password": "chompz4lyfe"
//      }

app.post('/login', (req, res) => { // '/login'인 라우터 경로에 post 메소드를 써서 요청, 응답
  console.log(req.body.email) // "sam@gmail.com"
  console.log(req.body.password) // "chompz4lyfe"
})
profile
뭐든 하자

0개의 댓글