인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

10.6 사용량 제한 구현하기파트 질문

해결된 질문

작성

·

276

0

nodebird-api 미들웨어 index.js코드 

const jwt = require("jsonwebtoken"); 
const rateLimit = require("express-rate-limit");
const User = require("../models/user");

exports.isLoggedIn = (req, res, next) => {
  if (req.isAuthenticated()) {
    
    next();
  } else {
    res.status(403).send("로그인 필요");
  }
};

exports.isNotLoggedIn = (req, res, next) => {
  if (!req.isAuthenticated()) {
    
    next();
  } else {
    const message = encodeURIComponent("로그인한 상태입니다.");
    res.redirect(`/?error=${message}`); 
  }
};


exports.verifyToken = (req, res, next) => {
  try {
    res.locals.decoded = jwt.verify(
      req.headers.authorization,
      process.env.JWT_SECRET
    );
    return next();
  } catch (error) {
    if (error.name === "TokenExpiredError") {
      return res.status(419).json({
        code: 419,
        message: "토큰이 만료되었습니다.",
      });
    }
    return res.status(401).json({
      code: 401,
      message: "유효하지 않은 토큰입니다.",
    });
  }
};

exports.apiLimiter = async (req, res, next) => {
  let user;
  if (res.locals.decoded) {
    user = await User.findOne({ where: { id: res.locals.decoded.id } });
  }
  rateLimit({
    windowMs: 60 * 1000,
    max: user?.type === "premium" ? 1000 : 10,
    handler(req, res) {
      res.status(this.statusCode).json({
        code: this.statusCode,
        message: "1분에 열 번만 요청할 수 있습니다.",
      });
    },
  });
};

exports.deprecated = (req, res) => {
  res.status(410).json({
    code: 410,
    message: "새로운 버전이 나왔습니다. 새로운 버전을 사용하세요",
  });
};

nodebird-api routes v2.js 코드 
const express = require("express");

const { verifyToken, apiLimiter } = require("../middlewares");
const {
  createToken,
  tokenTest,
  getMyPosts,
  getPostsByHashtag,
} = require("../controllers/v2");

const router = express.Router();


router.post("/token", apiLimiter, createToken);


router.get("/test", verifyToken, apiLimiter, tokenTest);


router.get("/posts/my", verifyToken, apiLimiter, getMyPosts);


router.get("/posts/hashtag/:title", verifyToken, apiLimiter, getPostsByHashtag);

module.exports = router;

프리미엄으로 클라이언트 비밀키 발급하고 프리미엄만 사용량제한 구현했는데 터미널에 GET/search/%EA%B3%A0%EC%96%91%EC%9D%B4 - - ms - - 이렇게 나오고 사이트로딩만 뜹니다 ㅜㅜ

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

nodecat 말고 nodebird-api쪽 터미널 봐보세요.

선생님 답변감사합니다 api터미널에 오류는 안뜨는데 max:1은 실행되는데 10부터 실행이 안되네요

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

오잉 오히려 숫자를 올리면 안뜨는건가요...? 1일 때는 nodecat nodebird-api 둘 다 성공이 뜨고 10일때는 둘 다 안 뜨나요?

네 ㅠㅠ API_URL=http://localhost:8002/v2로 했고 다시실행했는데 똑같네요 max:1만 실행되네요..

10일때 응답이 api하고 nodecat은 200뜹니다 1분에 열번 메시지가 안뜨고 제가 작성한게시글만뜹니다

계속 새로고침하니 드디어 뜨네요!

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기