인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

Hongsun1님의 프로필 이미지
Hongsun1

작성한 질문수

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

10.6 사용량 제한 질문

해결된 질문

작성

·

197

·

수정됨

0

nodebird-api 미들웨어 index.js 타입이 any로 떠서 프리미엄이 체크가 안되고 계속 제가 작성한 게시글정보만 뜹니다 사용량제한 어떻게 하나요? ㅠㅠ

 

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 = rateLimit({
  windowMs: 60 * 1000, // 1분
  max: 1,
  handler(req, res) {
    res.status(this.statusCode).json({
      code: this.statusCode, // 기본값 429
      message: "1분에 한 번만 요청할 수 있습니다.",
    });
  },
});

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

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

답변 1

0

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

타입스크립트가 아닌 자바스크립트인데 타입이 any라는게 무슨 말씀이신가요? 타입이 any인 것과 지금 상황은 아무 관련이 없습니다. 프리미엄 체크가 어디서 안 된다는 건가요? 게시글은 어디에 뜬다는 건가요? 질문을 구체적으로 이해가 되게 해주세요.

Hongsun1님의 프로필 이미지
Hongsun1
질문자

죄송합니다 선생님 빨리알고싶어서 중구난방으로 질문했습니다 정리해서 질문드리겠습니다

Hongsun1님의 프로필 이미지
Hongsun1

작성한 질문수

질문하기