공식 문서를 독파하며 새로운 지식을 학습하고, 기존 지식을 보완하며, 잘못된 내용은 삭제하며 학습합니다.
라우팅은 어플리케이션의 엔드포인트(URI 및 특정 HTTP 요청 메서드 - GET, POST 등) 정의 및 클라이언트 요청에 응답하는 방식을 말한다.
각 라우트는 하나 이상의 핸들러 함수를 가질 수 있으며, 이러한 함수는 라우트가 일치할 때 실행된다. 라우트 정의는 다음과 같은 구조를 지닌다.
app.METHOD(PATH, HANDLER);
app
: express의 인스턴스METHOD
: HTTP의 요청 메서드PATH
: 서버 경로HANDLER
: 라우트가 일치할 때 실행될 함수이를 통해 기본적인 라우트를 구현하면 다음과 같다.
const express = require('express`);
const app = express();
app.get('/', (req, res) => { res.send('Hello World!') });
라우트 메서드는 HTTP 메서드 중 하나로부터 파생되며, express 클래스의 인스턴스에 연결된다.
기본적으로 get, post, put, head, delete, options 등을 지원한다. app.all()
은 특수한 라우팅 메서드로 어떠한 HTTP 메서드로부터도 파생되지 않으며, 모든 요청 메서드에 대해 한 경로에서 미들웨어 함수를 로드하는 데 사용된다. 아래 예시의 경우 http 모듈에서 지원되는 모든 HTTP 요청 메서드를 실행할 때 함께 실행된다.
app.all('/secret', (req, res, next) => {
console.log('Accessing the secret section ...');
next();
});
라우트 경로는 요청 메서드와의 조합을 통해 엔드포인트를 정의한다. 문자열, 문자열 패턴 또는 정규식을 사용할 수 있다. express는 라우트 경로의 일치를 위해 path-to-regexp를 사용한다.
라우트 핸들러를 통해 미들웨어와 비슷하게 작동하는 여러 콜백 함수를 제공하여 요청을 처리할 수 있다. 이러한 콜백은 next('route')
를 호출하여 나머지 라우트 콜백을 우회할 수도 있다.
하나의 콜백 함수는 하나의 라우트를 처리할 수 있으며, 아래와 같이 next()
를 통해 2개 이상의 콜백함수를 하나의 라우트로 처리할 수도 있다.
app.get('/somthing', (req, res, next) => {
console.log('do something...');
next();
}, (req, res) => {
res.send('Hello from somthing!');
});
또한 콜백 함수 배열은 하나의 라우트로 처리할 수 있다.
var cb0 = (req, res, next) => {
console.log('CB0');
next();
}
var cb1 = (req, res, next) => {
console.log('CB1');
next();
}
var cb2 = (req, res) => {
res.send('Hello from somthing!');
}
app.get('/somthing', [cb0, cb1, cb2]);
위의 두 경우를 조합해서 독립적인 함수와 함수 배열을 하나의 라우트로 처리할 수 있다.
var cb0 = (req, res, next) => {
console.log('CB0');
next();
}
var cb1 = (req, res, next) => {
console.log('CB1');
next();
}
app.get('/somthing', [cb0, cb1], (req, res, next) => {
console.log('do something...');
next();
}, (req, res) => {
res.send('Hello from somthing!');
});
응답 오브젝트에 대한 메서드(res
)는 클라이언트의 요청에 대한 응답을 전송하고, 요청-응답 주기를 종료할 수 있다. 아래 메서드 중 어느 하나도 호출되지 않을 경우 클라이언트 요청은 정지된 채 방치된다.
res.download()
: 파일이 다운로드되도록 프롬포트res.end()
: 응답 프로세스 종료res.json()
: JSON 응답 전송res.jsonp()
: JSONP 지원을 통해 JSON 응답 전송res.redirect()
: 요청의 경로 재지정res.render()
: view template 렌더링res.send()
: 다양한 유형의 응답 전송res.sendFile()
: 파일을 octet-stream 형태로 전송res.sendStatus()
: 응답 상태 코드를 설정한 후 해당 코드를 문자열로 표현한 내용을 응답 본문으로 전송app.route()
사용시 라우트 경로에 대한 체인 가능한 라우트 핸들러를 작성할 수 있다. 아래와 같이 경로를 한 곳에 지정하여 중복성과 오타를 감소시킬 수 있다.
app.route('/user')
.get((req, res) => { ... })
.post((req, res) => { ... })
.put((req, res) => { ... });
express.Router 클래스를 사용하여 모듈식 마운팅 가능한 핸들러를 작성할 수 있다.(Router 인스턴스는 완전한 미들웨이자 라우팅 시스템으로 '미니 앱, mini-app'이라고도 한다.)
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => { ... });
router.post('/', (req, res) => { ... });
module.exports = router;
var userRouter = require('./user');
...
app.use('/user', userRouter);