middlewares - controller / app.use() / Morgan
routers - λΌμ°ν° λ§λ€κ³ μ¬μ©νκΈ°
middlewaresλ λΈλΌμ°μ μ requestsμ μλ²μ responsesμ μ€κ°μ μλ μννΈμ¨μ΄
λ₯Ό λ§νλ€.
μμμ μ¬μ©νλ handler ν¨μλ μ¬μ€ controller
λΌκ³ λΆλ¦°λ€.
λͺ¨λ controllerλ middlewareκ° λ μ μκ³ , λ§μ°¬κ°μ§λ‘ λͺ¨λ middlewareλ contollerκ° λ μ μλ€.
controllerκ° next() ν¨μλ₯Ό νΈμΆνλ€λ©΄, κ·Έ controllerλ middleware
κ° λλ€.
middlewareλ requestμ μλ΅νμ§ μκ³ , requestλ₯Ό μ§μμμΌμ€λ€.
middlewareλ μ¬μ©μκ° μΉ μ¬μ΄νΈμ μ΄λλ₯Ό κ°λ €κ³ νλμ§ λ§ν΄μ£Όλ ν¨μλ‘, νμν λ§νΌ λ§λ€μ΄ μ¬μ©ν μ μλ€.
const loggerMiddleware = (req, res, next) => { // controllerμ΄μ middleware
console.log(`Someone is going to: ${req.url}`):
next();
}
const handleHome = (req, res) => { // controller
return res.send("Hello!");
};
app.get('/', loggerMiddleware, handleHome);
λΈλΌμ°μ κ° root νμ΄μ§λ₯Ό κ°λ€λ¬λΌκ³ μμ²νλ©΄ expressλ loggerMiddleware ν¨μλ₯Ό νΈμΆνλ€.
consoleμ req.url μ¦, μ¬μ©μκ° μΉ μ¬μ΄νΈμμ κ°λ €κ³ νλ urlμ΄ μΆλ ₯λλ€.
κ·Έ ν, next()μ μν΄ λ€μ handleHome ν¨μκ° νΈμΆλλ€.
res.send("Hello!")κ° μ€νλμ΄ νλ©΄μ λ©μμ§κ° λ¨λ©΄μ requestκ° μ’
λ£λλ€.
κ·Έλ¬λ, μμ middlewareλ νλμ urlμλ§ μ μ©λμ΄ μμ΄ λ³λ‘ μΈλͺ¨κ° μλ€.
μ΄λ₯Ό κ³ μ³λ³΄μ.
μ΄λ urlμλ μλνλ global middleware
λ₯Ό λ§λ€ μ μλ€.
μμκ° μ€μνλ€. app.use()κ° λ¨Όμ μ¨ νμ app.get()μ΄ μμΌ νλ€.
λ§μ½ app.use()κ° μ΄λ€ routeλ₯Ό μΈμλ‘ κ°μ§λ app.get()λ³΄λ€ λ€μ μ¨λ€λ©΄ κ·Έ middlewareλ κ·Έ routeμλ μλνμ§ μλλ€.
const loggerMilddleware = (req, res, next) => {
console.log(`Someone is going to: ${req.url}`); // req.url === req.path
next();
};
const handleHome = (req, res) => {
return res.send("Hello!");
};
const handleLogin = (req, res) => {
return res.end();
};
app.use(loggerMilddleware);
app.get("/", handleHome);
app.get("/login", handleLogin);
νμΌμ μμ κ°μ΄ μμ ν ν μ μ₯νλ€.
localhost:4000 μ λ€μ΄κ°λ©΄, μ½μμ 'Someone is going to: /'μ΄ λ¬λ€.
localhost:4000/login μ λ€μ΄κ°λ©΄, μ½μμ 'Someone is going to: /login'μ΄ λ¬λ€.
ννΈ localhost:4000/aaaaa μ λ€μ΄κ°λ©΄, μλ²κ° μ΄ urlμ μΈμνμ§ λͺ»νλ―λ‘ νλ©΄μλ 'Cannot GET /aaaa'κ° λ¨μ§λ§ μ½μμλ 'Someone is going to: /aaaa'μ΄ λ¬λ€.
μ¦, μ΄λ urlμ΄ get request λμλ κ°μ μΌλ¨ global middlewareλ λͺ¨λ routeμμ μ€νλ¨μ μ μ μλ€.
const loggerMilddleware = (req, res, next) => {
// μ΄λ€ request methodκ° μ΄λ€ urlλ‘ ν₯νλμ§ μ μ μλλ‘ μ½λλ₯Ό μμ νλ€
console.log(`${req.method} ${req.url}`);
next();
};
const privateMiddleware = (req, res, next) => {
const url = req.url;
if (url === "/protected") {
return res.send("<h1>Not Allowed</h1>");
}
console.log("Allowed, you may continue.");
next();
};
const handleHome = (req, res) => {
return res.send("Hello!");
};
const handleProtected = (req, res) => {
return res.send("Welcome to the private lounge.");
};
app.use(loggerMilddleware);
app.use(privateMiddleware);
// app.use(loggerMiddleware, privateMiddleware); λΌκ³ μ μ΄λ λ¨
app.get("/", handleHome);
app.get("/protected", handleProtected);
localhost:4000/protected μ λ€μ΄κ°λ©΄, μ½μμλ loggerMiddleware ν¨μμ μν΄ 'GET /protected'κ° λ¨κ³ , νλ©΄μλ privateMiddleware ν¨μμ μν΄ 'Not Allowed'κ° λ¬λ€.
μ¦, privateMiddleware ν¨μμ if 쑰건μμ λ§μ‘±νμ¬ requestλ₯Ό μ§μνλ middlewareκ° requestλ₯Ό μ’
λ£νλ controllerκ° λ κ²μ΄λ€.
β» npm - morgan μ°Έκ³
Morganμ λ¬΄μ¨ μΌμ΄ μ΄λμμ μΌμ΄λ¬λμ§λ₯Ό κΈ°λ‘νλ λ° λμμ μ£Όλ node.js μ© request logger middlewareμ΄λ€.
VS code λ΄μ₯ ν°λ―Έλμ 'npm i morgan'μ μ
λ ₯ν΄ μ€μΉν μ μλ€.
morgan() ν¨μλ₯Ό νΈμΆνλ©΄μ μ€μ μ ν΄μ€μΌ νλ€.
import morgain from "morgan";
const logger = morgan("dev");
const handleHome = (req, res) => {
return res.send("Hello!");
};
app.use(logger);
app.get("/", handleHome);
morgan() ν¨μλ₯Ό νΈμΆνλ©΄, req, res, 'next'λ₯Ό ν¬ν¨ν middlewareλ₯Ό return
νλ€.
ν¨μμ μΈμλ‘ λ€μ΄κ° "dev"λ middlewareλ₯Ό μ€μ ν΄μ€λ€. dev, combined, tiny, common, shortμ 5κ°μ§ μ΅μ
μ λ£μ μ μλλ° μ΅μ
λ§λ€ κ°κ° μ½μμμ 보μ¬μ£Όλ κ²μ΄ λ€λ₯΄λ€.
μ€μ λ‘ wetube μ½λ© μμ β
νλ‘μ νΈμμ μ΄λ€ μ’
λ₯μ λ°μ΄ν°
λ₯Ό μ΄μ©ν κ²μΈμ§ μκ°ν΄μΌ νλ€.
wetube νλ‘μ νΈμμλ ν¬κ² λ κ°μ§μ λ°μ΄ν°λ₯Ό λ€λ£¬λ€.
첫 λ²μ§Έλ 'λΉλμ€(μμ)'μ΄κ³ , λ λ²μ§Έλ 'user(μ¬μ©μ)'μ΄λ€.
μ΄λ₯Ό wetube νλ‘μ νΈμ λλ©μΈ
μ΄λΌκ³ ν μ μλ€.
μ΄λ₯Ό url μ°¨μμμ μκ°ν΄λ³΄λ©΄, μλμ κ°μ url 리μ€νΈλ₯Ό μμ±ν μ μλ€.
π‘ κΈλ‘λ² λΌμ°ν°
/ β Home
/join β Join νμ΄μ§
/login β Login νμ΄μ§
/search β Search νμ΄μ§π‘ user λΌμ°ν°
/users/edit β Edit user νμ΄μ§
/users/delete β Delete user νμ΄μ§π‘ video λΌμ°ν°
/videos/watch β Watch video νμ΄μ§
/videos/edit β Edit video νμ΄μ§
/videos/delete β Delete video νμ΄μ§
/videos/comments β comment on a video νμ΄μ§
/videos/comments/delete β Delete a comment of a video νμ΄μ§
router(λΌμ°ν°)
λ μμ
μ€μΈ μ£Όμ λ₯Ό κΈ°λ°μΌλ‘ urlμ κ·Έλ£Ήννλ κ²μ λ§νλ€.
λΌμ°ν°λ λλ©μΈ(μ΄ κ²½μ°, videoμ user) λ³λ‘ λλ μ μλ€.
μλ₯Ό λ€μ΄, /videosλ‘ μμνλ λͺ¨λ urlλ€μ 'video λΌμ°ν°'λΌλ νλμ λΌμ°ν°λ‘ κ·Έλ£Ήνν μ μλ€.
κΈλ‘λ² λΌμ°ν°λ νμμ λ°λ‘ κ° μ μλ νμ΄μ§λ€μ λ΄κ³ μλ€
/ β Home
/join β Join νμ΄μ§
/login β Login νμ΄μ§
/serch β Search νμ΄μ§
μ¬μ€ μμμ λ°°μ΄ λλ‘λΌλ©΄ μ urlλ€μ κ·μΉμ μ΄κΈλ λ― λ³΄μΈλ€.
joinκ³Ό loginμ νλ κ²μ userμ΄κ³ search λλ κ²μ videosλΌλ©΄, urlμ μλμ²λΌ λμ΄μΌ νμ§ μμκΉ?
/
/users/join
/users/login
/videos/search
κ·Έλ¬λ μ€μ λ‘ λ³΄ν΅μ μ΄λ κ² urlμ λ§λ€μ§ μλλ€.
urlμ κΉλνκ² λ§λ€κΈ° μν΄ κ°λμ κ·μΉμ μ΄κΈ°κ³ μμΈλ₯Ό λ§λ€κΈ°λ νλ€.
μλμ κ°μ΄ μΈ κ°μ λΌμ°ν°λ₯Ό λ§λ€ μ μλ€.
const globalRouter = express.Router();
const userRouter = express.Router();
const videoRouter = express.Router();
λΌμ°ν°λ₯Ό λ§λ ν μ¬μ©νκΈ° μν΄ μ€μ μ ν΄μΌ νλ€
app.use("/", globalRouter);
app.use("/users", userRouter);
app.use("/videos", videoRouter);
첫 λ²μ§Έ μΈμλ‘ 'λ£¨νΈ url'μ, λ λ²μ§Έ μΈμλ‘ 'λΌμ°ν° μ΄λ¦'μ κ°μ Έμ¨λ€.
μ΄λ λ£¨νΈ url
μ΄λ κΈλ‘λ² λΌμ°ν°μ κ²½μ° '/'λ₯Ό, user λΌμ°ν°μ κ²½μ° '/users'λ₯Ό, video λΌμ°ν°μ κ²½μ° '/videos'λ₯Ό μλ―Ένλ€.
μ΄μ μ°λ¦¬μ μ±μ λ€λ₯Έ urlμ μ΄ν΄ν μ€λΉκ° λμλ€.
μ΄λ₯Ό λ°νμΌλ‘ κ°κ°μ λΌμ°ν°μ 첫 νμ΄μ§λ₯Ό λ§λ€ μ μλ€.
μμλ‘ κΈλ‘λ² λΌμ°ν°μ 첫 νμ΄μ§λ '/(μ¦, Home)'λ‘ νκ³ , user λΌμ°ν°μ 첫 νμ΄μ§λ 'users/edit'μΌλ‘ νκ³ , video λΌμ°ν°μ 첫 νμ΄μ§λ '/videos/watch'λ‘ νκΈ°λ‘ νλ€.
π μ½λ
// λΌμ°ν° λ§λ€κΈ°
// controller μ μ
// Router.get("λΌμ°ν°μ 첫 νμ΄μ§ url", controller);
const globalRouter = express.Router();
const handleHome = (req, res) => res.send("Home");
globalRouter.get("/", handleHome);
const userRouter = express.Router();
const handleEditUser = (req, res) => res.send("Edit User");
userRouter.get("/edit", handleEditUser);
const videoRouter = express.Router();
const handleWatchVideo = (req, res) => res.send("Watch Video");
videoRouter.get("/watch", handleWatchVideo);
app.use("/", globalRouter);
app.use("/users", userRouter);
app.use("/videos", videoRouter);
π κ²°κ³Ό
λΈλΌμ°μ μ μ£Όμ μ°½μ localhost:4000/ μ΄λΌκ³ μ
λ ₯ν΄ λ€μ΄κ°λ©΄, νλ©΄μ Home μ΄λΌκ³ λ¬λ€.
λΈλΌμ°μ μ μ£Όμ μ°½μ localhost:4000/users/edit λΌκ³ μ
λ ₯ν΄ λ€μ΄κ°λ©΄, νλ©΄μ Edit User λΌκ³ λ¬λ€.
λΈλΌμ°μ μ μ£Όμ μ°½μ localhost:4000/videos/watch λΌκ³ μ
λ ₯ν΄ λ€μ΄κ°λ©΄, νλ©΄μ Watch Video λΌκ³ λ¬λ€.
λ¬΄μ¨ μΌμ΄ μΌμ΄λ κ±ΈκΉ?
video λΌμ°ν°λ₯Ό μμλ‘ λ€μ΄ μ€λͺ
ν΄λ³΄κ² λ€.
π μ€λͺ
const videoRouter = express.Router(); // 2
const handleWatchVideo = (req, res) => res.send("Watch Video"); // 3
videoRouter.get("/watch", handleWatchVideo); // 2, 3
app.use("/videos", videoRouter); // 1
λκ΅°κ° /videosλ‘ μμνλ urlμ μ°ΎμΌλ©΄(μ΄ κ²½μ°μλ μ¬μ©μκ° /videos/watch λ₯Ό μ λ ₯νλ€κ³ νμ.), expressλ video λΌμ°ν° μμΌλ‘ λ€μ΄κ°λ€.
expressλ video λΌμ°ν° μμμ μ¬μ©μκ° μ λ ₯ν urlμ λλ¨Έμ§ μ£Όμ(μ¦, /watch)λ₯Ό μ°Ύλλ€. video λΌμ°ν°λ /watch λΌλ 1κ°μ§ 루νΈλ₯Ό κ°μ§λ―λ‘ μ°λ¦¬λ /videos μμ /watch μ μκ² λλ€.
κ·Έ λ€μμ expressκ° handleWatchVideo ν¨μλ₯Ό μ€νν¨μΌλ‘μ¨ νλ©΄μλ Watch Videoκ° νμλλ€.