Node JS
로 api를 짜던 와중에 req.params
와 req.body
의 차이가 궁금해서 쓰는 글.
req.params
와 req.body
둘 다 request 프로퍼티에 해당한다.
express
에서 request는 정확히 어떤 것일까?공식문서에 따르면,
'HTTP request'로써 'req'로 표현되는 객체이다. request 'query string', 'parameters, 'body', 'HTTP header' 등의 프로퍼티를 갖는다. 'req'객체는 'Node'의 request 객체보다 향상된 버전이다.
'req' 객체에는 다양한 프로퍼티가 있지만 그 중에서 req.params
와 req.body
, 그리고 req.query
위주로 살펴보겠다.
// @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
는 해당 라우트 경로에서 각각의 '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
일 수 있는 것이다.
'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"
})