에러처리 미들웨어 [ express ] [ node.js ]

2023. 7. 22. 04:20node.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

 

Express 오류 처리

오류 처리 다른 미들웨어 함수와 동일한 방법으로 오류 처리 미들웨어 함수를 정의할 수 있지만, 오류 처리 함수는 3개가 아닌 4개의 인수, 즉 (err, req, res, next)를 갖는다는 점이 다릅니다. 예를

expressjs.com

 

'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