해결된 질문
작성
·
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
저한테 너무 의존하지 마시고 직접 console.log 찍어가면서 따져보세요.
req.user.Domains[0].type === 'premium'이 맞는지부터 체크해보시면 됩니다.
선생님 콘솔로그 쳐서 premium위치 찾아서req.user.Domains[5].type === 'premium' 했는데 true 나와서 해결했습니다 감사합니다 앞으로 콘솔로그 쳐서 하는 습관가져야겠습니다 정말 감사합니다 ^_^!!!
네 nodebird-api, nodecat디렉토리에 있는 파일들 모두 삭제하고 다시 만들어도 결과가 1분에 한번만 요청할수있다고 나옵니다