에러 핸들링

http://blog.jeonghwan.net/node/2017/08/17/express-error-handling.html

https://github.com/FEDevelopers/tech.description/wiki/%EC%97%90%EB%9F%AC-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%9D%B5%EC%8A%A4%ED%94%84%EB%A0%88%EC%8A%A4-%EA%B0%80%EC%9D%B4%EB%93%9C

  • 에러 래퍼 패턴
1
2
3
4
5
6
7
8
9
10
11
12
13
function wrapAsync(fn) {

return function(req, res, next) {

// 모든 오류를 .catch() 처리하고 체인의 next() 미들웨어에 전달하세요

// (이 경우에는 오류 처리기)

fn(req, res, next).catch(next);

};

}
  • 에러 정의 및 핸들러
    • https://github.com/hapijs/boom
    • 400
      • 400 : 파라미터 불충분 : badRequest
      • 401 : 로그인 필요 : unauthorized
      • 404 : 페이지 없음
    • 500
      • 500 : 서버 에러
      • 504 : gatewayTimeout : 서버 시간 초과
  • 에러 핸들러
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// inheritance
errors.create({
name: 'FatalError',
defaultMessage: 'A fatal error occurred',
});
errors.create({
name: 'FatalSecurityError',
defaultMessage: 'A security error occurred, the app must exit',
parent: errors.FatalError
});
try {
throw new errors.FatalSecurityError();
} catch (e) {
if (e instanceof errors.FatalError) {
// exit
console.log("Application is shutting down...");
}
}

app.use(function handleAssertionError(error, req, res, next) {
if (error instanceof AssertionError) {
res.status(400).json({
type: 'AssertionError',
message: error.message
});
}
next(error);
});

app.use(function handleDatabaseError(error, req, res, next) {
if (error instanceof MongoError) {
res.status(503).json({
type: 'MongoError',
message: error.message
});
}
next(error);
});

남은 해결 과제

bookshelf 에러 핸들링