이번시간에는 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");
}