const jwt = require('jsonwebtoken')
const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');
const dotenv = require('dotenv');
dotenv.config();
const addLike = (req, res) => {
const book_id = req.params.id;
let authorization = ensureAuthorization(req);
if (authorization instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "로그인 세션이 만료되어 재로그인이 필요합니다"
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.BAD_REQUEST).json({
message: "잘못된 토큰 입니다."
});
} else {
let sql = "INSERT INTO likes (user_id, liked_book_id) VALUES (?, ?)";
let values = [authorization.id, book_id]
conn.query(sql, values,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(results);
})
}
};
const removeLike = (req, res) => {
const book_id = req.params.id;
let authorization = ensureAuthorization(req);
if (authorization instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "로그인 세션이 만료되어 재로그인이 필요합니다"
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.BAD_REQUEST).json({
message: "잘못된 토큰 입니다."
});
} else {
let sql = "DELETE FROM likes WHERE user_id = ? AND liked_book_id = ?";
let values = [authorization.id, book_id]
conn.query(sql, values,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(results);
})
}
};
function ensureAuthorization(req) {
try {
let receivedJwt = req.headers["authorization"];
console.log(receivedJwt)
let decodedJWT = jwt.verify(receivedJwt, process.env.PRIVATE_kEY);
console.log(decodedJWT);
return decodedJWT;
} catch (err) {
console.log(err.name + " : " + err.message);
return err;
}
}
module.exports = {
addLike, removeLike
};
const jwt = require('jsonwebtoken')
const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');
const dotenv = require('dotenv');
dotenv.config();
const addToCart = (req, res) => {
const { book_id, quantity } = req.body;
let authorization = ensureAuthorization(req);
if (authorization instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "로그인 세션이 만료되어 재로그인이 필요합니다"
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.BAD_REQUEST).json({
message: "잘못된 토큰 입니다."
});
} else {
let sql = "INSERT INTO cartItems (book_id, quantity, user_id) VALUES (?, ?, ?)";
let values = [book_id, quantity, authorization.id]
conn.query(sql, values,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(results);
})
}
};
const getCartItems = (req, res) => {
const { selected } = req.body;
let authorization = ensureAuthorization(req);
if (authorization instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "로그인 세션이 만료되어 재로그인이 필요합니다"
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.BAD_REQUEST).json({
message: "잘못된 토큰 입니다."
});
} else {
let sql = `SELECT cartItems.id, book_id, title, summary, quantity, price
FROM cartItems LEFT JOIN books
ON cartItems.book_id = books.id
WHERE user_id = ? AND cartItems.id IN (?)`;
let values = [authorization.id, selected];
conn.query(sql, values,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(results);
})
}
};
const removeCartItem = (req, res) => {
const id = req.params.id;
let sql = "DELETE FROM cartItems WHERE id = ?";
conn.query(sql, id,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(results);
})
};
function ensureAuthorization(req) {
try {
let receivedJwt = req.headers["authorization"];
console.log(receivedJwt)
let decodedJWT = jwt.verify(receivedJwt, process.env.PRIVATE_kEY);
console.log(decodedJWT);
return decodedJWT;
} catch (err) {
console.log(err.name + " : " + err.message);
return err;
}
}
module.exports = { addToCart, getCartItems, removeCartItem };
JWT에 문제가 생길 경우 if/else ⇒ try/catch로 예외처리 해줘야함
JWT
TokenExpiredError
⇒ 토큰 유효기간 종료(만료)된 경우
JsonWebTokenError
⇒ 토큰에 문제가 있는 경우
개발자가 예상하지 못한 에러(개발 오류, 사용자 입력 오류, 디비 응답 오류)를 처리하는 문법
try {
// 코드 실행
} catch (err) {
// 에러 처
}
⇒ try 구문의 코드를 실행하다가 에러가 발생하면, try 코드를 멈추고 바로 catch 문으로 err와 함께 빠져나감
⇒ try 구문에서 어떤 에러가 발생해도, 우리가 if문으로 분기 처리 해주던 내용들이 알아서 catch에 잡힘 (ex. SyntaxError, TypeError 등)
자바스크립트가 개발자분들의 노고를 보고, “내장” 에러 객체를 만들어둠
JWT라는 모듈에서도 제공하는 에러 객체도 있고, 우리가 직접 만들어서 사용도 가능함
let string = '{ "num" : 1 }'
try {
// username;
let json = JSON.parse(string);
if (!json.name) {
throw new SyntaxError("입력 값에 이름이 없습니다.");
} else {
console.log(json.name);
}
let name = json.name;
console.log(name);
} catch (err) {
console.log(err.name);
console.log(err.message);
}
즉, 에러가 날 경우 에러를 발생시키고 넘겨줌(throw)
브라우저에 요청을 보낼 때, 이전 쿠키값을 같이 보내주는 현상이 나타남
⇒ 이게 이전에 강의에서 한번 언급됐던, 브라우저가 쿠키값을 핑퐁하는 개념임
⇒ 즉, 우리는 요청을 보낼 때 마다 쿠키를 확인하는 절차와, 추가로 브라우저에서 또 다른 요청이 들어올 때 쿠키값이 변경된다면 이전 쿠키를 삭제해주는 작업도 필요
let receivedJwt = req.headers["authorization"];