장바구니 API에 로그인한 사용자 정보를 토큰을 이용해 가져와
사용하는 과정에서 오류가 발생했다.
[전체 코드]
const getCart = (req, res) => {
const {seleted} = req.body;
let loginUserID = ensureAuthrizaion(req, res);
let sql = `
SELECT cartItems.id, cart_book_id, title, summary, quantity, price
FROM cartItems LEFT JOIN books
ON cartItems.cart_book_id = books.id
WHERE cart_user_id = ?
AND cartItems.id IN(?)`;
conn.query(
sql,
[loginUserID.id, seleted],
(err, result) => {
if (err) {
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(result);
},
);
};
function ensureAuthrozaion(req, res) {
let receivedJWT = req.headers['authorization'];
let decodedJWT = jwt.verify(receivedJWT, `${process.env.PRIVATE_KEY}`);
return decodedJWT;
}
전체 코드는 이러하다.
가장 먼저 토큰이 완료된 TokenExpiredError 오류이다.
토큰이 완료되면 개발자인 우리는 무슨 오류인지 알 수 있지만
웹을 사용하는 사용자나 프론트 엔드 개발자는 무슨 오류인지도
모르고 서버가 죽어버리게 된다.
그렇기 때문에 사용되는 게 try~catch 문이다.
성공적으로 작업이 실행되면 try , 실패시 catch를 사용하면 된다.
function ensureAuthrozaion(req, res) {
try {
let receivedJWT = req.headers['authorization'];
let decodedJWT = jwt.verify(receivedJWT, `${process.env.PRIVATE_KEY}`);
return decodedJWT;
} catch (e) {
console.log(e);
return res.status(StatusCodes.UNAUTHORIZED).json({
message: '로그인 세센이 완료. 다시 로그인 필요',
});
}
}
이처럼 try~catch문을 사용해서 서버도 죽이지 않고
효율적으로 오류 메시지를 전달할 수 있게 되었다.
위의 오류는 해결되었지만 또다른 오류가 발생했다.
바로 JsonWebTokenError 오류인 요청을 2번 보냈을 때이다.
위의 전체 코드를 살펴보면 알겠지만
API를 실행하는 query문에서 한번, Authrozaion를 검증하는 함수에서 한번
총 2번 요청을 보내고 있어서 오류가 발생했다
이 오류는 당연하겠지만 요청을 한번만 보내서 해결하면 된다
function ensureAuthrizaion(req, res) {
try {
let receivedJWT = req.headers['authorization'];
let decodedJWT = jwt.verify(receivedJWT, `${process.env.PRIVATE_KEY}`);
return decodedJWT;
} catch (e) {
console.log(e);
return e;
}
}
Authrozaion 검증하는 함수에 요청을 없앤 후
const addCart = (req, res) => {
const {cart_book_id, quantity} = req.body;
let loginUserID = ensureAuthrizaion(req, res);
if (ensureAuthrizaion instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: '로그인 세센이 완료. 다시 로그인 필요',
});
} else {
// 성공적 실행 쿼리문
}
};
API 실행 코드를 if~else문으로 감싸서 오류가 나면
오류 메시지 요청 , 오류가 나지 않으면 정상적인 쿼리 실행이 되도록 했다.
정말 개발을 하다보면 예상치 못한 오류가 많이 발생하는 거 같다.
그동안 try~catch문을 사용하긴 했으나 그냥 예외 처리를 해주는 문법이라고만 알고 있었지
정확하게는 몰랐는데 이번 강의로 정확하게 알 수 있었다.