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

Hongsun1님의 프로필 이미지
Hongsun1

작성한 질문수

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

Premium 문의…!

해결된 질문

작성

·

384

1

선생님 어제 코드 감사합니다 아쉽게도 많이 배워야할것같아서 ㅠㅜ 혹시 제가 빠트린 코드가 있을까요 ? 아니면 다른부분 확인할 사항이 있을까요? 작성한 코드 올려드립니다

nodebird-api -> middlewares-> index.js

const jwt = require("jsonwebtoken"); //토큰을 검사하는 미들웨어
const rateLimit = require("express-rate-limit");
const User = require("../models/user");
const { Domain } = require("../models/");
const cors = require("cors");

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}`); //localhost:8001? error=메시지
  }
};

//토근검사
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: "유효하지 않은 토큰입니다.",
    });
  }
};

const limiter = rateLimit({
  widowMs: 60 * 1000,
  max: (req, res) => {
    if (req.user?.Domains[0]?.type === "premium") {
      return 10;
    }
    return 1;
  },
  handler(req, res) {
    res.status(this.statusCode).json({
      code: this.statusCode,
      message: `1분에 ${
        req.user?.Domains[0]?.type === "premium" ? "열" : "한"
      } 번만 요청 할 수 있습니다...`,
    });
  },
});

exports.apiLimiter = async (req, res, next) => {
  let user;
  if (res.locals.decoded) {
    user = await User.findOne({
      where: { id: res.locals.decoded.id },
      include: { model: Domain },
    });
  }
  req.user = user;
  limiter(req, res, next);
};

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

exports.corsWhenDomainMatches = async (req, res, next) => {
  const domain = await Domain.findOne({
    where: { host: new URL(req.get("origin")).host },
  });
  if (domain) {
    cors({
      origin: true,
      Credential: true,
    })(req, res, next); //미들웨어 확장패턴
  } else {
    next();
  }
};

 

nodebird-api -> routes -> v2.js

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

const router = express.Router();

router.use(corsWhenDomainMatches);

router.use(
  cors({
    origin: true, 
    credentials: true, //쿠키요청
  })
);

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


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


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

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

module.exports = router;

 

답변 1

1

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

이렇게 해도 안 된다는 말씀이신가요?

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

네 nodebird-api, nodecat디렉토리에 있는 파일들 모두 삭제하고 다시 만들어도 결과가 1분에 한번만 요청할수있다고 나옵니다

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

저한테 너무 의존하지 마시고 직접 console.log 찍어가면서 따져보세요.

req.user.Domains[0].type === 'premium'이 맞는지부터 체크해보시면 됩니다.

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

네 감사합니다!

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

선생님 콘솔로그 쳐서 premium위치 찾아서req.user.Domains[5].type === 'premium' 했는데 true 나와서 해결했습니다 감사합니다 앞으로 콘솔로그 쳐서 하는 습관가져야겠습니다 정말 감사합니다 ^_^!!!

Hongsun1님의 프로필 이미지
Hongsun1

작성한 질문수

질문하기