Middleware 함수는 어플리케이션의 request-response cycle에서 next 함수와 request object와 response object에 접근할 수 있다.
next 함수는 Express의 router 함수로서, 호출되면 현재 미들웨어 다음에 실행될 미들웨어를 실행한다.
다음과 같은 역할을 담당할 수 있다.
- 특정한 code를 실행할 수 있다.
- request, response object들을 바꿀 수 있다.
- request-response object를 끝낼 수 있다.
- stack에서 next middleware를 호출할 수 있다.
만일 현재 middleware function이 request-response cycle을 끝내지 못한다면, 반드시 next() 를 호출하여 제어권을 다음 middleware function에 넘겨줘야 한다.
import * as express from "express";
import { Cat, CatType } from "./Cat/CatType";
import { error } from "console";
const app: express.Application = express();
// 아래의 router들을 살펴보면 동일한 logging 작업이 반복된다.
// 이를 middleware에서 처리하도록 한다. middleware는 맨 위에 적어줘야 한다
// 만일 맨 끝에 작성하게 되면 동작을 하지 않는다.
// app.use: router 전체에 대한 middleware
app.use((req, res, next) => {
// next 함수: 다음 router로 이동할 수 있게 하는 함수.
console.log("========================================");
console.log("this is logging middleware");
console.log(req.rawHeaders[1]);
console.log("========================================");
next();
});
app.get("/cats/som", (req, res, next) => {
// next 함수: 다음 router로 이동할 수 있게 하는 함수.
// 이 경우 /cats/som 의 router로 넘어간다.
console.log("========================================");
console.log("this is logging middleware for cats/som");
console.log(req.rawHeaders[1]);
console.log("========================================");
next();
});
// 아래와 같은 구조를 router이라고 한다.
app.get("/", (req: express.Request, res: express.Response) => {
console.log("router");
res.send({ cats: Cat });
});
app.get("/cats/blue", (req: express.Request, res: express.Response) => {
console.log("router");
res.send({ blue: Cat[0] });
});
app.get("/cats/som", (req: express.Request, res: express.Response) => {
console.log("router");
res.send({ som: Cat[1] });
});
// middleware을 마지막에 배치하여 유효하지 않은 path에 대해 error를 처리할 수 있다.
app.use((req, res, next) => {
console.log("========================================");
console.log("middleware for handling error");
console.log({ error: "404 not found" });
console.log("========================================");
});
app.listen(8000, () => {
console.log("server is On");
});