Express error handling

Express에서 에러 핸들링하기

Express에서 에러 처리는 일반적인 3개의 인수(req, res, next)가 아닌 4개의 인수(err, req, res, next)를 갖습니다. 에러 핸들링을 하려면 모든 라우트 호출의 정의가 끝나고 가장 마지막에 정의해야 합니다.

1
2
3
4
5
6
7
8
9
import * as express from 'express';

const app = express()

app.use(bodyParser.json());
app.use(cookieParser());
app.use(middleware);
app.use(router);
app.use(errorHandler)

위와 같이 모든 미들웨어, 라우터가 정의 된 후에 errorHandler라는 에러핸들링 미들웨어를 추가해야 합니다. 에러핸들링 미들웨어는 여러가지를 추가 할 수 있습니다.

Error handling

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
import * as express from 'express';
import { Request, Response, NextFunction } from 'express';

interface Err extends Error {
name: string
message: string
status: number
}

const app = express();
const port = 4000;

// 'Hello world' response to all GET requests
app.get('*', (req: Request, res: Response, next: NextFunction) => {
res.send('Hello World!')
});

// All POST requests occur error
app.post('*', (req: Request, res: Response, next: NextFunction) => {
const err = {
name: 'Bad Request',
message: 'Invalid request.',
status: 400
};
next(err);
});

// Error Handling part
app.use((err: Err, req: Request, res: Response, next: NextFunction) => {
if (res.headersSent) return next(err);
const {name, message, status} = err;
res.status(status).json({name, message, status});
});

app.lisen(port, () => {
console.log(`🚀 App listening on the port ${port}`);
});

위와 같이 모든 GET요청에는 'Hello World!'를 응답하고 모든 POST요청에는 에러를 발생하도록 하겠습니다. POST의 에러는 nextFunction으로 에러메세지를 넘기도록 하겠습니다. 라우터에서 next()를 사용하여 에러를 넘기게 되면 모든 에러는 에러미들웨어로 처리를 위임 할 수 있습니다.

모든 GET요청에는 'Hello World!'를 잘 리턴합니다.

모든 POST요청에는 400 Bad Request상태코드와 커스텀 에러메세지를 응답합니다.

하지만 다른 PATCH와 같은 요청에는 위와 같이 응답값이 이쁘지 않습니다. 단지 404 Not Found상태코드와 에러를 발생합니다.
API가 존재하지 않는 요청에 대해서도 미들웨어를 통해 에러핸들링을 할 수 있습니다. 에러핸들링 바로 위에 404 Not Found에 관한 코드를 추가하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
app.use((req: Request, res: Response, next: NextFunction) => {
const err = {
name: 'Not Found',
message: 'The request was incorrect.',
status: 404
};
next(err);
});

// Error Handling part
app.use((err: Err, req: Request, res: Response, next: NextFunction) => {
if (res.headersSent) return next(err);
const {name, message, status} = err;
res.status(status).json({name, message, status});
});


에러핸들링 부분 바로 위에 notFound 미들웨어를 추가하면 모든 요청에 대한 커스텀 메세지를 보여 줄 수 있습니다. 이를 응용하여 404 page도 보여줄 수 있습니다.
에러핸들링은 순서가 매우 중요하므로 순서를 잘 생각하여 정의하셔야 합니다.
이 블로그 포스팅과 관련된 코드는 여기를 참고 바랍니다.

공유하기