1) Express 앱의 태생적 오류 처리기
throw error
2) 사용자 지정 오류 처리기 정의하기
Express에서는 다른 미들웨어처럼 오류처리 미들웨어 함수를 정의할 수 있음.
- 주의점은 오류 처리 함수를 만들 때 4개의 인수를 전달해야함.
- err, req, res, next
- 해당 4개의 인수를 모두 기입해야 오류 처리 미들웨어로 인식함.
- 디폴트 오류 핸들러에서 상태코드 500을 받지 못함. (브라우저 창에서)
- 콘솔창에는 오류메시지 뜸.
- 어떤 코드든 Mongoose, 작업하던 라이브러리에서 오류가 발생, 일부러 오류를 발생하는 등 오류 상황이 발생하면 오류처리 미들웨어가 실행됨.
- 그리고 다른 미들웨어와 마찬가지로 오류처리 미들웨어 역시 next 호출하지 않을시 코드 종료.
password 쿼리 입력하지 않을시
next 에 err 전달하기
- Express에 내장된 오류핸들러 사용시 next에 err 전달해줘야함.
전달하지 않을 때
전달 했을 때
기본적으로 앱에서 오류발생시 코드에서 발생했든 고의로 띄운것이든 상관없이 커스텀 오류 핸들러가 가장 우선적으로 작동.
- 추가적으로 미들웨어에 기입한 오류를 작동시키고 싶으면 next(err)를 입력해주면 됨.
3) 사용자 지정 오류 클래스
오류 처리 패턴 중 하나 : 커스텀 오류 클래스
- 각기 다른 상황에서의 오류를 모두 처리하기에는 번거로움.
- 따라서 제너릭 오류를 설정하는 대신 앱 오류나 Express 오류나 커스텀 오류를 발생시킴.
<index.js>
app.get('/error',(req, res) => {
chicken.fly();
})
const verifyPassoword = ((req,res, next)=> {
const { password } = req.query;
if (password === 'chickennugget'){
next();
} else {
throw new AppError('Password required', 401)
}
})
app.get('/secret', verifyPassoword, (req, res) => {
res.send('MY SECRET IS : .... ')
})
Results
4) 비동기 오류 처리하기
라우트 핸들러와 미들웨어에 의해 발동된 비동기 함수에서 반환된 오류같은 경우 다음의 함수에 전달해 Express 가 잡아내게끔 만들어줘야 한다.
--> throw 로 넘기지말고 비동기 함수에서는 세번째 인자인 next를 통해서 express 자체적으로 오류를 인지할 수 있게 만들어야한다.
- 주의점: next 함수는 다음 라우트핸들러나 미들웨어를 실하므로 오류를 반환하고 res.render 함수를 실행한게된다. 그러면 콘솔창에 해당 품목은 존재하지 않은 오류가 뜨게 되므로 next에 'return'을 달아서 next가 반환하는 오류만 던지고 종료하게 만든다.
5) 비동기 오류 처리 더 알아보기
try ... catch
- next에게 err를 전달시켜 next가 err를 반환하게끔 함.
오직 비동기 함수일때만 그런것이고 async, await 조합이 아닌 동기식 함수는 express가 알아서 감지가 가능하므로 try...catch 구문을 적용할 필요가 없다.
- 어디서 온 오류든 모두 잡아내 next로 전달.
6) 비동기 유틸리티 정의하기
- 비동기 콜백을 감싸주는 함수를 만들어서 오류가 나올 때마다 반복해서 try...catch 문을 쓰지 않아도 되게 하는것.
- WrapAsync함수는 새로운 함수를 반환하는 함수임.
- 그리고 그 만들어진 새로운 함수는 전달된 게 무엇이든 실행에 옮겨 다시 wrapAsync로 전달함.
- .catch를 추가해 오류발생시 next로 호출.
- 즉, WrapAsync 함수전체가 WrapAsync를 호출하는 새 함수를 반환하면 오류를 잡아냄.
비동기 함수에서 오류를 잡아냄
7) Mongoose 오류 구분하기
Mongoose에는 문제의 종류에 따라 발생시키는 다양한 종류가 있음.
- 업데이트 품목명을 기입하지 않았을 때 발생하는 오류.
- 유효하지 않은 품목 id 입력시 발생되는 오류.
Mongosee의 오류 하나를 잡고 해당 오류가 등장시 출력되는 문구 정해보기
- 'ValidationError 가 생겼을 때 마다 handleValidatonErr 함수 발동.
point : Express에서 4개의 인자가 있는 함수를 사용할 때 첫 매개변수인 err를 오류 처리 미들웨어로 취급해서 라우트에서 발생되거나 또는 이전 미들웨어에서 발생된 오류가 있을경우 처음으로 일치하는 항목을 출력. // 비동기함수일 경우에는 추가적으로 함수를 추가해 오류를 잡아냄 (WrapAsync)