2023. 7. 22. 04:20ㆍnode.js
다른 미들웨어 함수와 동일한 방법으로 오류 처리 미들웨어 함수를 정의할 수 있지만, 오류 처리 함수는 3개가 아닌 4개의 인수, 즉 (err. req. res, next) 를 갖는다는 점이 다르다.
오류 처리 미들웨어는 다른 app.use() 및 라우트 호출을 정의한 후에 마지막으로 정의해야 하며, 예를 들면 다음과 같다.
// app.js
// ...
// 에러 핸들링 미들웨어 정의
app.use((err, req, res, next) => {
const status = err.statusCode || 500;
const errorMessage = err.message || "서버 에러";
res.status(status).json({
errorMessage,
});
});
// ...
미들웨어 함수 내부로부터의 응답은 HTML 오류 페이지, 단순한 메시지 또는 JSON 문자열 등 선호하는 모든 형식일 수 있다.
조직적(및 상위 레벨 프레임워크) 목적을 위해, 여러 오류 처리 미들웨어 함수를 정의할 수 있으며, 이는 일반적인 미들웨어 함수를 정의할 때와 매우 비슷하다.
에러처리 미들웨어의 장단점
장점
1. 코드 중복 감소 : 에러 처리를 중앙 집중화하여 코드 중복을 줄일 수 있다. 각 라우터나 컨트롤러에서 에러 처리를 하지 않고 미들웨어에서 한 번에 처리할 수 있다.
2. 에러 로깅 : 에러 처리 미들웨어에서 에러를 로깅하여 애플리케이션의 동작을 모니터링하고 디버깅하기 용이하다.
3. 일관된 응답 : 에러 처리 미들웨어를 통해 일관된 형태의 에러 응답을 클라이언트에게 변환할 수 있다. 이 때문에 클라이언트가 에러를 쉽게 이해하고 처리할 수 있다.
4. 에러 핸들링 로직 분리 : 애플리케이션의 핵심 로직과 에러 처리 로직을 분리하여 코드를 깔끔하게 유지할 수 있다.
단점
1. 코드 복잡성 : 에러 처리 미들웨어를 추가하면 애플리케이션 코드가 더 복잡해질 수 있다. 또 에러 핸들링과 관련된 미들웨어를 이해하고 관리하는데 노력이 필요하다.
2. 세밀한 제어 어려움 : 에러 처리 미들웨어는 모든 에러를 처리하므로 세밀한 에러 핸들링이 필요한 경우에는 다른 방식으로 처리해야 할 수도 있다.
작성한 오류처리 코드
// utils/error.utils.js
class ServerError extends Error {
constructor(message) {
super(message);
this.statusCode = 500;
}
}
class BadRequestError extends Error {
constructor(message) {
super(message);
this.statusCode = 400;
}
}
class ConflictError extends Error {
constructor(message) {
super(message);
this.statusCode = 409;
}
}
module.exports = {
ServerError,
BadRequestError,
ConflictError,
};
// controllers/register.controller.js
// ...
try {
// ...
if (password !== confirm) {
throw new BadRequestError("비밀번호가 틀립니다.");
}
// ...
if (!user) {
throw new ConflictError("이미 가입된 이메일 또는 닉네임입니다.");
}
return res.status(201).json({ message: "회원가입을 완료하였습니다." });
} catch (err) {
next(err);
}
// ...
// register.repository.js
createUser = async (email, nickname, password) => {
const existUserEmail = await Users.findOne({ where: { email } });
if (existUserEmail) {
throw new ConflictError("이미 존재하는 이메일 입니다.");
}
const existUserNickname = await Users.findOne({ where: { nickname } });
if (existUserNickname) {
throw new ConflictError("이미 존재하는 닉네임입니다.");
}
// ...
};
참고 링크
https://expressjs.com/ko/guide/error-handling.html
'node.js' 카테고리의 다른 글
passport.js [ node.js ] (0) | 2023.07.27 |
---|---|
multer (0) | 2023.07.20 |
JWT 토큰 [ node.js ] [ express ] (0) | 2023.07.16 |
bcrypt 사용방법 [ Javascript ] [ node.js ] (0) | 2023.07.07 |
PM2 사용 (0) | 2023.06.24 |