Contents1. 미들웨어와 라우터 객체의 차이점 2. 라우팅 분리하기 3. next('route') 4. 라우터 주소에 특수 패턴 사용하기 5. METHOD 분리하기
미들웨어와 라우터 객체의 차이점은 Express.js 공식문서에서도 따로 구분을 하고 있지는 않습니다.
하지만 Router 객체를 이용해서 라우터를 분리할 수 있습니다.
// index.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('Hello This is Index Page');
});
module.exports = router;
// user.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('Hello This is User Page');
});
module.exports = router;
// app.js
const express = require('express');
const indexRouter = require('index');
const userRouter = require('user');
const app = express();
app.set('port', process.env.PORT || 3000);
app.use('/', indexRouter);
app.use('/user', userRouter);
app.listen(app.get('port'), () => {
console.log(app.get('port'), '에서 대기중');
});
index.js, user.js, app.js 파일들을 다음과 같이 작성하고
node app.js
app.js 를 실행시켜주고 각각 localhost:3000, localhost:3000/user 에 접속하게 되면
Hello This is Index Page, Hello This is User Page 메시지를 확인할 수 있습니다.
미들웨어에서 next() 함수를 사용하여 다음 미들웨어로 넘어갈 수 있습니다.
미들웨어 뿐만 아니라 라우터에서도 이와 같이 다음 라우터로 넘어갈 수 있습니다.
next('route') 를 사용하여 라우터에 연결된 나머지 미들웨어들을 건너뛰고
다음 라우터로 넘어갈 수 있습니다.
router.get('/', (req, res, next) => {
console.log('첫 번째 라우터의 미들웨어 실행');
next('route');
}, (req, res, next) => {
console.log('이 미들웨어는 실행되지 않습니다.');
});
router.get('/', (req, res, next) => {
console.log('두 번째 라우터가 실행됨');
});
next('route') 를 호출하게 되면 일치하는 주소의 다음 라우터로 넘어가게 됩니다.
라우터 주소에는 정규표현식을 사용할 수 있고 특수 패턴 또한 사용할 수 있습니다.
특수 패턴 중 라우트 매개변수 라고 불리는 패턴은 다음과 같습니다.
router.get('/user/:id', (req, res) => {
console.log(req.params, req.query);
});
라우트 매개변수를 위와 같이 사용하게 되면 라우터는 /user/1234 /user/1 과 같은 요청도 위 라우터가 처리하게 됩니다. 만약 /user/12345678?age=5&exp=9 요청이 들어오고
req.params 과 req.query 를 출력해 보면
{ id: '12345678' } { age: '5', exp: '9' }
위와 같이 출력되게 됩니다.
app.route 혹은 router.route 를 사용해서 요청 METHOD를 분리시킬 수 있습니다.
이렇게 사용하게 되면 같은 요청 path의 코드들을 한데 묶어 볼 수 있어서 편리합니다.
router.route('/path')
.get((req, res) => {
res.send('GET /path');
})
.post((req, res) => {
res.send('POST /path');
});