카테고리 없음

[Node.js]오류 처리를 위해 express-async-errors활용하자

장일규 2022. 5. 8. 18:10

이번시간에는 express-async-errors를 이용해 쉽게 오류 핸들링을 하는 방법을 공부해 보겠습니다.

그 전에 먼저 restapitutorial - HTTP Status Codes에서 자주 사용하는 HTTP 상태코드를 알아보겠습니다.

errors Validation 도식화

CustomAPIError.js

해당 클래스를 하위 HTTP상태코드 클래스에서 상속하여 에러 발생 시 메시지를 받을 수 있도록 합니다.

class CustomAPIError extends Error {
    constructor(message) {
        super(message);
    }
}

module.exports = CustomAPIError;

 

bad-request.js

Bad Reqeust는 400에러를 처리하는 클래스이다.

400은 보통 클라이언트가 잘못된 입력 값을 요청했을 때 서버에서 400으로 핸들링해주어야합니다.

회원가입 시 회원이 값을 하나라도 입력안했을 경우 400을 리턴하기위해 해당 클래스를 생성하였습니다.

require('dotenv').config();

const { StatusCodes } = require('http-status-codes');
const User = require('../models/User');
const CustomAPIError = require('./custom-api-error');

class BadReqeustError extends CustomAPIError {
    constructor(message) {
        super(message);
        this.StatusCodes = StatusCodes.BAD_REQUEST;
    }
}

module.exports = BadReqeustError;

 

index.js

모든 상태코드 클래스를 모듈화 하는 파일입니다.

모든 상태코드를 사용하고자 하는 파일에서 require하면 지저분하기 때문에 다음과 같이 모듈화 하여 사용합니다.

const CustomAPIError = require('./custom-api-error');
const BadReqeustError = require('./bad-request');

module.exports = {
    CustomAPIError,
    BadReqeustError,
};

 

Usage

npm매니저를 이용해 express-async-errors라이브러리를 Node.js 프로젝트에 설치합니다.

npm install express-async-errors --save

회원을 등록하는 스키마를 생성했다.

서비스에 회원 가입하기 위해서는 필수적으로 이메일, 비밀번호, 이름, 성별이 필요하다.

하지만 클라이언트인 사용자에 실수로 이름을 입력하지않고 서버에 넘긴 상태이다.

회원가입할 때 필요한 유효성 검증

1. 회원에 이메일이 이미 존재한지 확인한다.

2. 모든 필수적인 값이 입력이 되어 있는지 확인한다.

http-status-codes 사용하지 않은 경우

const { StatusCodes } = require('http-status-codes');
const User = require('../models/User');

const registerUser = async (req, res) => {
    const { gender, name, email, password } = req.body;

    // 
    if (!gender || !name || !email || !password) {
         return res
                 .status(StatusCodes.BAD_REQUEST)
                .json({ msg: "please provide all information"})
    }

    const user = await User.create(req.body);
}

클라이언트가 보낸 body에 모든 값을 디스트럭처링(Destructuring) 하여 필수적으로 입력 받았는지에 대한 유효성을 검사하고 있다.

  • http-status-codes없이 바로 리턴할 경우
    • StatusCode에 관리가 안된다.
    • 코드가 길어진다.

http-status-codes 사용한 경우

const User = require('../models/User');

const registerUser = async (req, res) => {
    const { gender, name, email, password } = req.body;
    if (!gender || !name || !email || !password) {
        //http-status-codes 사용 될 경우
        throw new BadReqeustError("please provide all information");
    }