참고 :이 글은 nestjs를 처음 배운 후 블로거의 지식과 이해를 기록한 것입니다. 아직 경험이 얕고 글의 내용은 참고 용일뿐입니다. 오류가 있으면 수정 해주세요.
하나 : 측면으로
이 기사에서는 세부 사항을 일시적으로 논의하지 않습니다.
1. Aspect 유형 : ExceptionFilter 인터페이스 구현 클래스
2. Aspect 입력
HttpException 예외 개체
ArgumentsHost 매개 변수 호스트 개체
3. 단면 출력 : 이상 반응 구성
4. 사용 시나리오의 측면
- 예외 처리
예외 처리
기본 제공 예외 계층은 전체 응용 프로그램에서 발생한 모든 예외를 처리합니다. 처리되지 않은 예외가 발견되면 최종 사용자는 친숙한 응답을 받게됩니다.
1. 처리 없음
- 전역 캡처 후 반환 된 응답 구조
{
"statusCode": 500,
"message": "Internal server error"
}
2. 일반 수요 처리
- 수동으로 던지기
// 方式1:直接抛出HttpException,异常信息为forbidden
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
// 方式2:直接抛出HttpException,异常信息为object
throw new HttpException({
status: HttpStatus.FORBIDDEN,
error: 'This is a custom message',
}, HttpStatus.FORBIDDEN);
// 方式3:抛出HttpException子类(内置异常/自定义异常)
throw new UnAuthenticationException();
// 自定义异常类UnAuthenticationException
// export class UnAuthenticationException extends HttpException {
// constructor() {
// super('not authentication', 30000);
// }
// }
- 전역 캡처 후 반환 된 응답 구조
// 方式1
{
"statusCode": 403,
"message": "Forbidden"
}
// 方式2
{
"status": 403,
"error": "This is a custom message"
}
// 方式3
{
"statusCode": 30000,
"message": "not authentication"
}
3. 복잡한 수요 처리
특정 응답이 예외에 의해 캡처되기 전에 aop aspect 처리 (예 : 로깅 등)를 추가해야하는 경우 예외 필터를 추가하여 달성 할 수 있습니다.
수동 투척 (이 측면에주의하지 마십시오)
예외 필터 캡처
- 예외 필터 정의
import {
ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import {
Request, Response } from 'express';
@Catch(HttpException)// @Catch()会捕获不经手动抛出的异常(即第一种不作处理的异常)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const status = exception.getStatus();
// 在此可做一些切面操作,如记录日志,也可修改响应结构
response
.status(status)
.json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}
// 另一种:继承式全局异常过滤器
- 예외 필터 바인딩
@Post()
@UseFilters(HttpExceptionFilter) // 通过@UseFilters这个装饰器,使被装饰的方法绑定HttpExceptionFilter这个异常过滤器
async create(@Body() createCatDto: CreateCatDto) {
throw new ForbiddenException();
}
// 另一种:也可绑定为全局/模块异常过滤器
전역 캡처 후 반환 된 응답 구조
{
statusCode: 'status:xxx',
timestamp: 'date:xxx',
path: 'url:xxx',
}