코드를 작성하다 보면 발생할 가능성인 높은 혹은 예상하지 못한 에러에 대해서 처리를 하는데 처음엔 모든 경우에 수에 if문을 달아서 처리를 했었다. 하지만 이렇게 하면 에러처리 하는 코드가 매우 길어지고 보기도 불편했다.
// signup.controllers.js
const { signupSchema } = require('../middlewares/validationMiddleware');
...
const { error } = signupSchema.validate(req.body);
// ../middlewares/validationMiddleware
const Joi = require('joi');
const signupSchema = Joi.object().keys({
loginId: Joi.string().min(3).max(10).alphanum().required().messages({
'string.base': 'loginId는 문자열이어야 합니다.',
'string.alphanum': '알파벳 대소문자와 숫자만 입력 가능합니다.',
'string.min': 'loginId는 3자이상입니다.',
'string.max': 'loginId는 10자이하입니다.',
'string.required': 'loginId를 입력해주세요.',
}),
...
module.exports = {
signupSchema,
loginSchema,
};
그래서 찾은 방법이 joi 라이브러리를 통해 파일을 따로 분리하고 유효성 검사를 통해서 에러를 처리하는 것이었다. 추가로 이번엔 더 편하게 처리하는 방법이 없을까 하다가
// errorMiddleware.js
class CustomError extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;
}
}
module.exports = CustomError;
// asyncHandler.js
const asyncHandler = (requestHandler) => {
return async (req, res, next) => {
try {
await requestHandler(req, res);
} catch (error) {
next(error);
}
}
};
module.exports = asyncHandler
// app.js
app.use((err, req, res, next) => {
const statusCode = err.statusCode || 500;
const message = err.message || '잘못된 요청입니다.';
res.status(statusCode).send({
success: false,
message: message
});
});
const jwt = require("jsonwebtoken");
const { Users } = require("../models");
require("dotenv").config();
const asyncHandler = require('../middlewares/asyncHandler')
const CustomError = require('../middlewares/errorMiddleware');
module.exports = asyncHandler(async (req, res, next) => {
const { MM } = req.cookies;
const [type, token] = (MM ?? "").split(" ");
if (!type || !token || type !== "Bearer") {
throw new CustomError("로그인이 필요한 기능입니다1.", 403)
}
const decodeToken = jwt.verify(token, process.env.JWT_SECRET);
const userId = decodeToken.userId;
const findUser = await Users.findOne({ where: { userId } });
if (!findUser) {
throw new CustomError("로그인이 필요한 기능입니다2.", 403)
}
res.locals.user = findUser;
next();
});
이렇게 에러처리를 하니 try... catch문과 if문으로 에러를 발생시킬 때 코드가 확 줄어서 보기도 편하고 간결한 에러 처리가 가능했다.
'오늘 뭐했냐 > 함께했던 작업들' 카테고리의 다른 글
23.08.22 레디스 클라우드(Redis Cloud) (0) | 2023.08.31 |
---|---|
23.08.21 프로젝트 중간 점검 (0) | 2023.08.30 |
23.08.08 passport-kakao (0) | 2023.08.13 |
23.08.07 passport-local (0) | 2023.08.12 |
23.08.06 쿠키 전달의 문제 (0) | 2023.08.10 |