Node.js
에러 처리, 미들웨어
selonjulie
2022. 6. 13. 11:41
에러 핸들링(Error Handling)
- 정의: 컴퓨터가 자바스크립트 문법을 실행하는 과정 자체에서 발생하는 에러. 서비스를 이용하는 동안 발생할 수 있는 에러를 사전에 예측하여 유도해야함
- 발생 가능한 에러
- 네트워크 에러, 오타, 모듈 없음 등
- 서비스 배포하기 전에는 에러가 나도 됨. 하지만 배포 후에는 발생해서는 안됨
- Express error handling
- Control flow and error handling - JavaScript | MDN
예외 핸들링(Exception Handling)
- 정의: 컴퓨터 적으로는 에러는 아니지만 개발자가 판단하기에 정상정인 상황이 아닌 것. 개발자가 의도적으로 만들어낸 것
- 발생 가능한 에러
- 회원가입, 로그인 규칙 등
- 사용자가 이메일에 @을 넣지 않았을때 (컴퓨터적는 잘 실행되지만) 서비스 입장에서는 예외 사항임
- 쇼핑몰에서는 물건 구매시 배송지가 없을 때, 최소 주문 금액
- 예외처리: 함수 내부에서 if문 등으로 예외 상황을 일으켜 에러를 발생시켜두어야함 (백앤드는 예외 처리를 꼼꼼하게 해야함)
- 백앤드 -> 프론트 response할때 메세지로 알려야함. 프론트->유저에게 알림
- throw, try, catch
*서버가 터졌다 : 서버에서 문제가 일어났다
const { email, password } = req.body
if (!email.includes('@')) {
return new Error('EMAIL_INVALID')
}
if (password.length < 10) {
return new Error('PASSWPRD_INVALID')
}
사용 가능한 에러, 예외 처리법
- 위와 같이 에러를 return하는 상황은 일반적이진 않음. 대부분 throw를 사용
- Throw new Error("에러 메세지"): 에러를 던진다(에러 발생)
- 에러가 발생하면, 진행하는 작업을 중단시키고, 에러를 호출한 상위 모듈(try-catch)로 제어를 넘김
- throw문을 통해 에러 객체를 던져야함
- Try-catch: 에러를 잡는다(에러 생성). try..catch문으로 에러를 처리하면 프로그램이 강제 종료되지 않음
- Try: 에러가 발생할 가능성이 있는 코드 입력
- try에서 예외처리를 위해 에러를 throw하면, 발생한 에러가 catch 블록으로 넘어감
- try블록 내부에 throw코드가 있거나, throw코드를 내장하고 있는 다른 함수를 호출하는 부분이 있음
- Catch: 에러가 발생했을 때를 대비한 행동
- Try: 에러가 발생할 가능성이 있는 코드 입력
throw new Error('EMAIL_INVALID')
throw new Error('message')
try{
//실행할 코드 (에러 발생 가능성 있는 코드)
if(){
throw error;
}
} catch (err){
//try 코드 블록에서 에러가 발생하면 이 코드가 실행
//err에는 try코드 블록에서 발생한 error 객체가 전달
}
try{
const { email, password } = req.body
if (!email.includes('@')){
const error = new Error('EMAIL_INVALID')
error.statusCode = 400
throw error
}
if (password.length < 10) {
const error = new Error('PASSWORD_INVALID')
error.statusCode = 400
throw error
}
...
} catch (err){
console.log(err)
return res.json ({
}
Error 객체
Error 생성자 함수를 여러 객체를 생성함. 에러를 상세히 설명하는 에러 메세지를 인수로 전달 함
-message 프로퍼티 : Error 생성자 함수에 인수로 전달한 에러 메세지
-stack 프로퍼티: 에러를 발생시킨 콜스텍의 호출 정보를 나타내는 문자열
const error = new Error('invalid');
회원가입시 email, password 에러 처리
app.post("/users/signup", async (req, res) => {
try {
const { email, password } = req.body;
//회원가입 API custom 예외처리
// console.log("email: ", email, "password: ", password);
//비밀번호가 8글자 미만일 때
if (password.length < 10) {
const error = new Error("PASSWORD_TOO_SHORT");
error.statusCode = 400;
throw error;
}
//중복된 email일 떄
const checkDuplicate = await prisma.$queryRaw`
SELECT users.email FROM users WHERE email=${email}`;
if (checkDuplicate.length !== 0) {
const error = new Error("EXSITING_USER");
error.statusCode = 409;
throw error;
}
const createdUser = await prisma.$queryRaw`
INSERT INTO users(email, password) VALUES (${email}, ${password});`;
return res.status(201).json({ message: "SIGNUP_SUCCESS" });
} catch (err) {
console.log(err);
return res.status(err.statusCode || 500).json({ message: err.message });
}
});
에러 핸들링 미들웨어(Middleware)
- 반복적인 에러 핸들링 처리를 하기 위해, 공통된 작업을 모듈화 하는 용도
- 예외처리를 밖으로 빼서 함수처리처럼 import해서 사용
- 가독성이 좋아짐: 함수명을 알아들을 수 있게 지을 수 있기 때문에
- 수정이 용이함
- 전체 다 적용해야해서 app.use((err, req res, next) =>{})
- err.statusCode 혹은 err.message로 처리 가능
- user 관련 에러 메세지는 보안상 문제로 모호할 수록 좋음 '유저 정보가 잘못되었습니다 (O)', '비밀번호가 틀렸습니다(X) ->아이디는 맞다는 힌트를 주기 때문에'
- 미들웨어를 넣어주면 try, catch를 다 없애도 됨
- 라우터, create 뒤에 위치
- Express error handling
app.use((err, req res, next) =>{
})