[Node.js] Express 미들웨어란?
미들웨어(Middleware)란?
HTTP 요청(req)과 응답(res) 중간(미들)에서 단계별 동작을 수행하는 함수로 HTTP요청이 들어온 순간부터 시작이 된다.
HTTP 응답이 마무리 될 때 까지 미들웨어 동작 사이클이 실행된다.
미들웨어 작성법
req, res, next를 가진 함수를 작성하면 미들웨어로 동작할 수 있다.
req: HTTP 요청 처리하는 객체
res: HTTP 응답 처리하는 객체
next: 다음 미들웨어로 요청을 넘기는 함수로 순차적으로 처리된다.
어플리케이션 미들웨어
app.use((req, res) => {
console.log(`Request ${req.path}`);
});
app.get("/", (req, res) => {
res.send("Hello Express");
});
app.listen(8080, () => {
console.log("listening on 8080");
});
위 코드는 use()로 모든 요청이 지나가서 8080으로 실행이 된다고 콘솔에 찍히지만 app.get() 은 진행이 되지 않는다.
다음으로 넘어가기 위해서 next()함수를 사용해야 한다.
app.use((req, res, next) => {
console.log(`Request ${req.path}`);
next();
})
app.get('/', (req, res, next) => {
res.send('Hello Express');
})
모든 요청을 다 처리 후 next()함수를 통해 다음 미들웨어를 호출한다. 호출하지 않으면 미들웨어 사이클이 멈춤
라우터 매개변수
/ 뒤에 :(콜론)을 사용한 와일드카드도 가능한데 예를 들어 /:id 라는 경로가 있으면 id를 req.params.id로 불러올 수 있다.
app.get('/page/:id', (req, res) => {
console.log(req.params.id)
})
요청들어온 url이 page/123 이라면 {id: '123'}
* 코드를 위에서부터 읽기 때문에 다른 라우터보다 뒤에 위치시켜야 한다.
라우터 미들웨어
라우터 미들웨어는 router 객체에 미들웨어가 적용된다. 특정 경로의 라우팅에만 미들웨어를 적용하기 위한 방법
// index.js
const express = require("express");
const book = require("./routes/book");
const app = express();
app.get("/", (req, res, next) => {
res.send("Hello Express");
});
app.use((req, res, next) => {
console.log(`Request ${req.path}`);
next();
});
app.use("/book", book);
app.listen(8080, () => {
console.log("listening on 8080");
});
// book.js
const express = require("express");
const router = express.Router();
router.get("/", (req, res, next) => {
res.send("book page");
});
module.exports = router;
여러개의 미들웨어를 동시에 적용할 수 있다. 전달된 인자의 순서 순으로 동작
오류처리 미들웨어
일반적으로 가장 마지막에 위치하는 미들웨어
err, req, res, next 4개의 인자를 가지며 next() 함수에 인자가 전달되면 실행된다.
app.use((err, req, res, next) => {
res.send('Error');
})
이전에 적용된 미들웨어 중 next()에 인자를 넘기는 경우 중간 미들웨어는 뛰어 넘고 오류처리 미들웨어가 바로 실행된다.
Refernece
- 엘리스