app.use()는 global middleware를 생성한다.
어떤 url을 받던 작동한다는 뜻이다.
코드 작성 순서가 중요한데 아래와 같은 순서로 작성할 경우 사용자가 홈에 들어올때 부터 작동하게 된다.
const handleHome = (req, res) => {
return res.send("welcome home");
};
const logCheckMiddleware = (req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
};
app.use(logCheckMiddleware);
app.get("/", handleHome); // GET /
위의 경우 logCheckMiddleware를 거친 후 handleHome이 작동된다.
하지만, app.use()의 순서를 아래와 같이 바꾸면 최초 접속시 홈에서는 미들웨어가 작동하지 않고 다른 url 요청을 받을때 작동한다.
app.use(f1,f2)
처럼 다수의 함수를 받을수도 있다.
const handleHome = (req, res) => {
return res.send("welcome home");
};
const logCheckMiddleware = (req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
};
app.get("/", handleHome); // console에 찍히지 않음
app.use(logCheckMiddleware);
app.get("/h1", handleHTML); // GET /h1
모든 컨트롤러는 (req, res, next) 세 개의 argument를 가진다.
그 중 middleware로 사용되는 것은 next로 넘겨주는 작업이 필요하다.
import morgan from "morgan"; // import 뒤의 morgan은 다른걸로 교체 가능
const logger = morgan("dev"); // 선언은 필수가 아님
app.use(logger); // morgan은 logger middleware이다.
const urlCheckMiddleware = (req, res, next) => {
let url = req.url;
if (url === "/protected") {
return res.send("<h1>Not Allowed<h2>");
}
console.log("lets go next");
next();
};
const pracMiddleware = (req, res, next) => {
console.log(`client is going ${req.url}`);
next();
};
const handleHome = (req, res) => {
return res.send("welcome home");
};
app.get("/", pracMiddleware, handleHome); // cclient is going /