https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/
Express
라우팅
클라이언트의 요청에 해당하는 메소드
와 Endpoint
에 따라 서버가 응답하는 방법(분기점)을 결정하는 것이다.
Express의 라우터로 구현한 Mini Node Server
const router = express.Router()
router.get('/lower', (req, res) =>{
res.send(data)
})
router.post('/lower', (req, res) =>{
// do something
})
라우트 메소드
// GET method route
app.get('/', function (req, res) {
res.send('GET request to the homepage');
});
// POST method route
app.post('/', function (req, res) {
res.send('POST request to the homepage');
});
미들웨어 함수는 요청 오브젝트(req
), 응답 오브젝트 (res
), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한을 갖는 함수이다. 그 다음의 미들웨어 함수는 일반적으로 next
라는 이름의 변수로 표시된다.
미들웨어를 사용하는 상황
모든 요청에 대해 url이나 메소드를 확인할 때
POST 요청 등에 포함된 body(payload)를 구조화할 때(쉽게 얻어내고자 할 때)
모든 요청/응답에 CORS 헤더를 붙여야 할 때
요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때
미들웨어 작동 원리 이해하기
미들웨어는 말 그대로 프로세스 중간에 관여하여 특정 역할을 수행한다.
위 그림은 endpoint가 /
이면서, 클라이언트로부터 GET
요청을 받았을 때 적용되는 미들웨어이다. 파라미터의 순서에 유의해야 한다. req
, res
는 우리가 잘 아는 요청(request)/응답(response)이고, next
는 다음 미들웨어를 실행한다. 이 콘텐츠의 최상단에 나오는 이미지에서 next
의 역할을 확인할 수 있다.
위 그림을 살펴보면, 미들웨어 내부에서는 아무런 작업을 하고 있지 않다. 그저 next()
함수를 호출하여 다음 미들웨어로 데이터를 전달하고 있다.
만약 특정 enpoint가 아니라 모든 요청에 동일한 미들웨어를 적용하려면 메소드 app.use
를 사용한다.
const express = require('express');
const app = express();
const myLogger = function (req, res, next) {
console.log('LOGGED'); // 이 부분을 req, res 객체를 이용해 고치면, 여러분들은 모든 요청에 대한 로그를 찍을 수 있습니다.
next();
};
app.use(myLogger);
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
id
는 'req.params.id'로 불러올 수 있다. req 객체에 'parameter'라는 프로퍼티가 있고, 그 프로퍼티의 id
라는 프로퍼티로 접근해 요청을 보낼 수 있는 것. // @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");
}
});
// 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'
// 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"
})
new Date()
는 javascript에서 시간과 날짜를 표현하는 객체
getDate()
메서드는 주어진 날짜의 현지 시간 기준 일을 반환
const birthday = new Date('August 19, 1975 23:15:30').getDate();
console.log(birthday);
// expected output: 19