예외 처리
try...catch
예상하지 못한 수많은 에러를 처리하는 문법이다.
try 구문의 코드를 실행하다가 에러가 발생하면 try 코드를 멈추고 catch로 빠져나간다. try 구문에서 발생하는 모든 에러는 catch에 잡힌다.
try {
// 코드 실행
} catch (error) {
// 에러 처리
} finally {
// 항상 실행되어야 하는 코드
}
catch의 error 파라미터가 내장 에러 객체인 경우 name과 message 속성을 가지고 있다. name은 에러의 이름이고, message는 에러의 내용을 보여준다.
try {
// 코드 실행
} catch (error) {
console.log(error.name);
console.log(error.message);
}
throw
에러를 발생시키는 연산자이다.
throw 에러_객체
특정 타입의 표현이 아니라 무엇이든 던질 수 있다. 문자열, 숫자, 불리언 등 모두 가능하다.
try {
throw new Error('에러 객체');
} catch (err) {
console.log(err.name); // Error
console.log(err.message); // 객체
}
try {
throw "String Error";
} catch (err) {
console.log(err); // String Error
}
jwt 구현
로그인이 필요한 기능에 대해 요청이 들어오면 쿠키에 있는 토큰을 읽는다.
토큰 받아오기
토큰은 request의 headers의 authorization에 적혀있다. 토큰을 복호화했을 때, 토큰에 문제가 없으면 복호화한 토큰을 반환한다. 토큰에는 사용자의 고유 id와 email이 적혀있다. 반환된 토큰에 적혀있는 사용자의 id로 DB 작업을 할 수 있다.
function ensureAuthorization(req) {
try {
const receivedJwt = req.headers['authorization'];
const decodedJwt = jwt.verify(receivedJwt, process.env.PRIVATE_KEY);
return decodedJwt;
} catch (err) {
console.log(err.name);
console.log(err.message);
return err;
}
}
토큰 에러
유효하지 않은 토큰이면 에러가 발생한다.
TokenExpiredError
만료된 토큰일 경우 발생하는 에러이다.
instanceof는 해당 객체가 특정 클래스에 속하는지 확인할 수 있다. 참 또는 거짓을 반환한다. 따라서 아래 코드는 만료된 토큰으로 인한 오류인지에 대해 확인하고, 로그인 세션이 만료되었다는 메시지를 발송하는 코드이다.
JsonWebTokenError
header나 payload를 분석할 수 없거나 jwt 서명, 수신자, 발급자, ID, 주제 등이 유효하지 않으면 발생하는 에러이다.
토큰 유효성 검사 코드
로그인이 필요한 API들의 미들웨어로 넣어주면 중복되는 코드를 줄일 수 있다.
function validateToken(req, res, next) {
const 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: '잘못된 토큰입니다.'
});
}
return next();
}
module.exports = { ensureAuthorization, validateToken };
미들웨어 예시
carts.js
const { validateToken } = require('../jwtAuthorization');
// 장바구니 담기
router.post(
'/',
[validateToken],
addToCart
);
// 장바구니 아이템 목록 조회, 선택한 장바구니 상품 목록 조회
router.get(
'/',
[validateToken],
getCartItems
);
배운 점
- try...catch 구문을 사용하면 예상하지 못한 수많은 에러를 처리할 수 있다.
- throw 연산자를 통해 에러를 발생시킬 수 있다. 에러를 발생시킬 표현식으로 에러 객체 뿐만 아니라 문자열, 숫자, 불리언 등 무엇이든 사용할 수 있다.
- instanceof 연산자로 해당 객체가 특정 클래스에 속하는지 확인할 수 있다. 이것을 이용해 각 에러에 따라 다른 명령을 실행할 수 있다.
'데브코스' 카테고리의 다른 글
[9주차 - DAY2] jwt 확인과 pagination (0) | 2024.04.23 |
---|---|
제발 정렬 좀 시켜달라고 (0) | 2024.04.22 |
[8주차 - DAY5] 주문 API 구현 (0) | 2024.04.19 |
[8주차 복습 발표] 비동기 처리 (1) | 2024.04.18 |
[8주차 - DAY4] 비동기 (0) | 2024.04.18 |