https://github.com/Chriso004/Node-study/tree/main/nodejs/Router
이전에 라우터를 만들 때 app.get()을 사용하여 라우팅을 하였는데, 그렇게 처리를 할 경우 연결해야 할 라우터의 양이 늘어나게 되면 코드가 매우 길어지게 된다. 따라서 express에 존재하는 라우터 객체를 사용한다. express.Router()
./routers/user.js 파일을 생성한다.
const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
res.render("user.html");
});
router.get("/about", (req, res) => {
res.send("about user");
})
module.exports = router;
...
http://localhost:3000/user의 요청이 오면 user.html을 렌더링 해주고, http://localhost:3000/user/about의 요청이 오면 about index라는 메세지로 응답한다.
./routers/index.js
const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
res.render("index.html")
});
router.get("/about", (req, res, next) => {
next("route");
}, (req, res, next) => {
res.send("두 번째로 실행되고 싶어");
next();
}, (req, res, next) => {
res.send("세 번째로 실행되고 싶어");
next();
});
router.get("/about", (req, res) => {
res.send("about index");
});
module.exports = router;
위 코드는 http://localhost:3000/의 요청이 오면 index.html을 렌더링 해준다. /about에선 next("route")의 코드가 사용되었는데 해당 코드는 라우터에 연결된 다른 미들웨어를 모두 건너뛰고 다음 라우터로 이동시킨다. 따라서 중간에 존재하는 res.send()를 스킵하고, about index라는 메세지를 응답하게 된다.
router.get("/user/:id/:name", (req, res) => {
console.log(req.params.id, req.params.name, req.query);
});
:id는 해당 문자를 그대로 나타내는 것이 아니라 /user/*과 같이 뒤에 어떠한 매개 변수가 오더라도 처리가 가능합니다. 만약 회원 정보를 조회한다고 치면 해당 url 부분에 유저의 아이디를 포함하여 요청/user/cHr1s0을 하고 해당 요청받은 ID를 통해 조회하도록 처리 할 수 있습니다.
req.params는 :id에 해당하는 값이다. 만약 라우터가 /user/:id/:name이라면 req.params.id, req.params.name을 통해 해당 값들을 확인 할 수 있다.
req.query는 쿼리 문자열에 대한 매개 변수에 대한 속성을 말한다. 예를 들어 http://localhost:3000/user/about/111/cHr1s0?permission=admin이라면 출력은
111 cHr1s0 { permission: 'admin' }이 된다.
express의 req, res 객체는 http 모듈의 res, req 객체를 확장한 것이다. 따라서 기존 http 모듈의 메소드나, express의 메소드나 속성을 사용 할 수 있다.