1 분 소요

middleWare

image-20220325095650474

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 에 자동으로 연결됩니다.

카테고리:

업데이트:

댓글남기기