express.Router

app.js에 모든 라우터를 포함시키면 코드 가독성이 떨어지기 때문에, express.Router를 통해 이를 방지할 수 있다.

// app.js
// 라우터 설정
app.use('/', indexRouter);
app.use('/user', userRouter);
// routes/index.js
const express = require('express');
const router = express.Router();
// GET / 라우터
router.get('/', (req, res) => {
    res.send('Hello, Express Router!');
});
 
module.exports = router;
const express = require('express');
const router = express.Router();
// GET /user 라우터
router.get('/', (req, res) => {
    res.send('User Router');
});
 
module.exports = router;

라우트 매개변수

:id를 넣으면 req.params.id로 받을 수 있다.

동적으로 변하는 부분을 라우트 매개변수로 만든다.

router.get('/user/:id', function(req, res) {
    console.log(req.params, req.query);
});

일반 라우터보다 뒤에 위치해야 한다.

router.get('/user/:id', function(req, res) {
    console.log('/user로 시작하는 라우터를 다 처리');
})
router.get('/user/like', function(req, res) {
    console.log('해당 코드는 실행 x');
})

/user/123?limit=5&skip=10 주소 요청인 경우

{ id: '123' } { limit: '5', skip: '10' }

라우터 그룹화하기

주소는 같지만 메서드가 다른 코드가 있을 때

router.get('/abc', (req, res) => {
    res.send('GET /abc');
});
router.post('/abc', (req, res) => {
    res.send('POST /abc');
});

router.route로 묶음

router.route('/abc')
    .get((req, res) => {
        res.send('GET /abc');
    })
    .post((req, res) => {
        res.send('POST /abc');
    });

기타

메서드 체이닝을 지원한다.

res
    .status(201)
    .cookie('test', 'test')
    .redirect('/admin')

응답은 한 번만 보내야 한다.

응답을 여러 번 보내는 경우, 다음과 같은 에러가 발생한다.

Error: Can't set headers after they are send.
    at validateHeader (_http_outgoing.js:489:11)
    at ServerResponse.setHeader (_http_outgoing.js:496:3)