Middleware
middleWare
API는 요청이 들어왔을 때부터 응답으로 내보내기까지의 전 과정을 처리한다.
그 안에 여러가지 함수들을 차례대로 거치게 되는데 그 함수 하나를 middleware라고 한다.
middleware를 이용해서 공통적인 코드를 하나의 middleware로 만들어서 여러 라우터에 실행시킬 수 있다.
예시
const UserService = require("../services/userService");
const jwt = require("jsonwebtoken");
const validateToken = async (req, res, next) => {
try {
const token = req.headers.token; //헤더에 있는 토큰을 읽어와서
if (!token) {
return res.status(404).json({ message: "USER_NOT_FOUND" });
}
//jwt 키를
jwt.verify(token, process.env.SECRET, (error, decoded) => {
if (error) {
return res.status(400).json({ message: "WRONG_TOKEN" });
}
if (decoded) {
user_info = jwt.verify(token, process.env.SECRET);
}
});
const foundUser = await UserService.findUser(user_info.user_id); //db에서 이용자가 있는지 확인한다.
if (!foundUser) {
// 이 토큰을 가진 유저가 데이터베이스에 없으면 404 에러를 냅니다.
return res.status(404).json({ message: "USER_NOT_FOUND" });
}
req.foundUser = foundUser; // request 객체에 새로운 키값에 찾아진 유저의 정보를 할당하고
next(); // next() 함수로 다음 미들웨어로 맥락(context)를 연결합니다.
} catch (err) {
next(err);
}
};
module.exports = {
validateToken, //라우터로 보낸다.
};
사용자의 토큰을 이용해서 서비스를 이용할 때마다 인증과정을 해줘야 하기 때문에
미들웨어로 하나 만들고 필요할 때마다 사용할 수 있다.
const express = require("express");
const productController = require("../controllers/productController");
const { validateToken } = require("../middlewares/validateToken"); //validateToken 미들웨어를 불러어서
const router = express.Router();
router.get("/categories", productController.categories);
router.get("/products", productController.products);
router.get("/:id", productController.products);
router.get("/detail", productController.detail);
router.post("/likes", validateToken, productController.likes);
//productController.likes가 실행되기 전에 먼저 validateToken을 실행 시킨다.
router.post("/commentInsert", validateToken, productController.commentInsert);
module.exports = router; // 이렇게 내보내면 부모 router 에 자동으로 연결됩니다.
댓글남기기