fastifyErrorHandler
이 페이지에서 찾을 수 있는 것
| 심볼 | 분류 | 설명 |
|---|---|---|
fastifyErrorHandler | Function | Fastify 전역 에러 핸들러 |
개요
fastifyErrorHandler는 Fastify의 setErrorHandler()에 등록되는 전역 에러 핸들러입니다. FastifyWrapper를 거치지 않고 던져진 에러, 또는 Fastify 내부에서 발생한 에러를 처리합니다. @asapjs/error의 resolveErrorBody()를 사용하여 프레임워크에 독립적인 방식으로 에러 바디를 생성합니다.
import { fastifyErrorHandler } from '@asapjs/fastify';함수 시그니처
function fastifyErrorHandler(
error: FastifyError | Error | unknown,
request: FastifyRequest,
reply: FastifyReply,
): void| 파라미터 | 타입 | 설명 |
|---|---|---|
error | FastifyError | Error | unknown | 처리할 에러 객체. Fastify 내부 에러, HttpError, 일반 Error, 또는 알 수 없는 값 모두 처리합니다. |
request | FastifyRequest | 에러가 발생한 요청 객체. 로그 컨텍스트 수집에 사용합니다. |
reply | FastifyReply | 에러 응답을 전송할 응답 객체. |
동작 방식
fastifyErrorHandler가 호출되면 다음 순서로 동작합니다:
-
에러 컨텍스트 로깅 — 다음 정보를 로그에 기록합니다:
requestId— Fastify가 생성한 요청 식별자method— HTTP 메서드 (예:GET,POST)url— 요청 URLip— 클라이언트 IP 주소file,line,function— 에러 스택에서 추출한 발생 위치
-
에러 바디 생성 —
@asapjs/error의resolveErrorBody(error)를 호출하여 HTTP 상태 코드와 응답 바디를 결정합니다. -
응답 전송 —
reply.code(errorBody.status).send(errorBody)로 에러 응답을 전송합니다.
resolveErrorBody()의 에러 분류
resolveErrorBody()는 @asapjs/error 패키지에서 제공하는 프레임워크 독립적인 함수입니다. 에러 유형에 따라 다음과 같이 응답 바디를 결정합니다:
| 에러 유형 | 조건 | HTTP 상태 | 응답 바디 |
|---|---|---|---|
HttpError | error() 팩토리로 생성 | err.status | { status, errorCode, message, data } |
| status + message 객체 | status와 message 속성 있음 | err.status | { status, errorCode, message } |
| 처리되지 않은 오류 | 위 조건 모두 해당 없음 | 500 | { status: 500, errorCode: 'INTERNAL_SERVER_ERROR', message } |
등록 방법
fastifyErrorHandler는 FastifyRouterPlugin이 초기화 과정에서 자동으로 등록합니다. 직접 등록할 필요는 없지만, FastifyRouterPlugin 없이 Fastify를 사용하는 경우 수동으로 등록할 수 있습니다:
import Fastify from 'fastify';
import { fastifyErrorHandler } from '@asapjs/fastify';
const app = Fastify();
app.setErrorHandler(fastifyErrorHandler);에러 응답 예제
HttpError 응답
import { error } from '@asapjs/error';
const UserNotFound = error(404, 'USER_NOT_FOUND', '사용자를 찾을 수 없습니다');
// 핸들러에서 던지면:
throw new UserNotFound();
// 응답:
// HTTP 404
// {
// "status": 404,
// "errorCode": "USER_NOT_FOUND",
// "message": "사용자를 찾을 수 없습니다"
// }처리되지 않은 에러 응답
// 핸들러에서 던지면:
throw new Error('예상치 못한 오류');
// 응답:
// HTTP 500
// {
// "status": 500,
// "errorCode": "INTERNAL_SERVER_ERROR",
// "message": "예상치 못한 오류"
// }FastifyWrapper와의 관계
FastifyWrapper도 내부적으로 에러를 처리하지만, 두 에러 처리 경로는 서로 다른 상황에서 동작합니다:
| 경로 | 동작 시점 | 처리 방식 |
|---|---|---|
FastifyWrapper 내부 | 라우트 핸들러에서 에러 발생 시 | reply.status().send()로 직접 응답 |
fastifyErrorHandler | Fastify 내부 에러, 미들웨어 에러, 기타 | reply.code().send()로 응답 |
fastifyErrorHandler는 @asapjs/error의 resolveErrorBody()를 사용하여 에러를 정규화하지만, FastifyWrapper는 자체 에러 처리 로직을 구현합니다. 두 경로의 응답 형식은 유사하지만 세부 동작에 차이가 있습니다:
FastifyWrapper:HttpError→error.toJSON(),{status, message}객체 →errorCode: 'HTTP_EXCEPTION', 기타 →errorCode: 'INTERNAL_SERVER_ERROR'fastifyErrorHandler:resolveErrorBody()를 통해HttpError, 레거시HttpException(errorCode: 'LEGACY_HTTP_EXCEPTION'),HttpErrorBody객체, 기타 에러를 정규화
관련 항목
- FastifyExecuteArgs —
FastifyWrapper의 에러 처리 - FastifyRouterPlugin — 에러 핸들러 자동 등록
- @asapjs/error —
error()팩토리와resolveErrorBody()