nestjs에서 이상 필터 Exceptionfilter의 구체적인 사용
8635 단어 nestjs이상 필터Exceptionfilter
절단면 프로그래밍 AOP는 프로그래밍 규범과 유사한 동쪽이다. 동문 형제는 인터페이스 프로그래밍, SOLID 원칙 등이 있다.
Nestjs 예외 처리
기본 예외 처리
Nestjs에는 Httpexception으로 변환할 수 있는 기본 전역 이상 필터가 내장되어 있습니다.
Httpexception 또는 하위 클래스 예외의 경우 이 예외의 JSON 형식이 반환됩니다.
{"exceptionCode":40005,"message":" ","path":"/"}
Httpexception 또는 하위 클래스 예외가 아닌 경우 다음과 같이 반환됩니다.
{"statusCode":500,"message":"Internal server error"}
Nestjs는 내장된 기본 이상 처리를 사용하기 때문에 포획되지 않은 이상으로 인해 프로그램이 붕괴되지 않습니다.사용자 정의 이상 필터 처리
내장된 이상 처리 반환값 형식을 조정할 수 없기 때문에 사용자 정의 이상은 정상적으로 보입니다.사용자 정의 이상은 이상 정보를 되돌려 사용자 정의를 할 수 있고 사용자 정의 이상 인코딩을 증가시켜 클라이언트 직원들이 이상 인코딩에 따라 다른 전시를 할 수 있도록 한다.
어떻게 이상을 사용자 정의합니까?
반복적으로 바퀴를 만들지 않는 것은 프로그래머의 자아 구속이다. 우선 우리는 우리의 이상한 기류를 새로 만든다.
import { HttpException } from "@nestjs/common";
/**
*
*
* @export
* @class BaseException
* @extends {HttpException}
*/
export class BaseException extends HttpException {
/**
* Creates an instance of BaseException.
* @param {number} exceptionCode
* @param {string} errorMessage
* @param {number} statusCode
* @memberof BaseException
*/
constructor(public exceptionCode: number, public errorMessage: string, public statusCode: number) {
super({ exceptionCode: exceptionCode, errorMessage: errorMessage }, statusCode);
}
/**
*
*
* @return {*}
* @memberof BaseException
*/
getExceptionCode(): number {
return this.exceptionCode;
}
getErrorMessage(): string {
return this.errorMessage;
}
getStatusCode(): number {
return this.statusCode;
}
}
그리고 사용자 정의 이상 코드가 추가된 권한이 부여되지 않은 이상 유형을 새로 만듭니다.
import { HttpStatus } from "@nestjs/common";
import { BaseException } from "./base.exception";
export class UnCauhtException extends BaseException {
constructor() {
super(40000, " , !", HttpStatus.FORBIDDEN);
}
}
사용자 정의 이상을 설정하면 권한이 부여되지 않은 이상을 처리해야 합니다. 우선 사용자 정의 이상 처리 기본 클래스를 새로 만듭니다. 여기서 우리가 사용하는 일을 주의하십시오. Express:
import { ArgumentsHost, ExceptionFilter, HttpException } from "@nestjs/common";
import { HttpArgumentsHost } from "@nestjs/common/interfaces";
import { BaseException } from "src/exceptions/base.exception";
import { Response, Request } from "express";
/**
*
*
* @export
* @class BaseExceptionFilter
* @implements {ExceptionFilter<BaseException>}
*/
export abstract class BaseExceptionFilter implements ExceptionFilter<BaseException>
{
/**
*
*
* @abstract
* @param {BaseException} exception
* @param {ArgumentsHost} host
* @memberof BaseExceptionFilter
*/
abstract catch(exception: BaseException, host: ArgumentsHost);
/**
* http
*
* @protected
* @param {ArgumentsHost} host
* @return {*}
* @memberof BaseExceptionFilter
*/
protected getHttpContext(host: ArgumentsHost) {
return host.switchToHttp();
}
/**
* http
*
* @protected
* @param {HttpArgumentsHost} httpContext
* @return {*}
* @memberof BaseExceptionFilter
*/
protected getResponse(httpContext: HttpArgumentsHost): Response {
return httpContext.getResponse<Response>();
}
/**
* http
*
* @protected
* @param {HttpArgumentsHost} httpContext
* @return {*}
* @memberof BaseExceptionFilter
*/
protected getRequest(httpContext: HttpArgumentsHost): Request {
return httpContext.getRequest<Request>();
}
/**
*
*
* @param {ArgumentsHost} host
* @param {BaseException} exception
* @memberof BaseExceptionFilter
*/
protected writeToClient(host: ArgumentsHost, exception: BaseException) {
const ctx = this.getHttpContext(host);
if(exception instanceof BaseException){
this.getResponse(ctx).status(exception.statusCode).json({
exceptionCode: exception.getExceptionCode(),
message: exception.getErrorMessage(),
path: this.getRequest(ctx).url
});
}else {
const httpException=exception ;
this.getResponse(ctx).status(500).json({
message: " ",
path: this.getRequest(ctx).url
});
}
}
}
새 무단 예외 처리:
import { ArgumentsHost, Catch } from "@nestjs/common";
import { AuthException } from "src/exceptions/auth.exception";
import { BaseException } from "src/exceptions/base.exception";
import { BaseExceptionFilter } from "./base.exception.filter";
@Catch(AuthException)
export class AuthExceptionFilter extends BaseExceptionFilter
{
constructor(){
super();
console.log(" "+new Date().toISOString());
}
catch(exception: AuthException, host: ArgumentsHost) {
exception.exceptionCode=40002;
console.log(" "+new Date().toISOString());
this.writeToClient(host,exception);
}
}
무단 예외 처리 클래스에 대한 몇 가지 설명:적용 범위
이상 처리 클래스는 method, controller, 전역, 심지어 같은 Controller에서 여러 개의 사용자 정의 이상 클래스를 정의할 수 있다
import { Controller, ForbiddenException, Get, HttpException, HttpStatus, UseFilters } from '@nestjs/common';
import { AppService } from './app.service';
import { AuthException } from './exceptions/auth.exception';
import { BusinessException } from './exceptions/business.exception';
import { UnCauhtException } from './exceptions/uncauht.exception';
import { AuthExceptionFilter } from './filters/auth.exception.filter';
import { BusinessExceptionFilter } from './filters/business.exception.filter';
/**
* ff
*/
@UseFilters(AuthExceptionFilter,BusinessExceptionFilter)
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
//throw new Error("666");
throw new BusinessException(" ",HttpStatus.OK);
throw new AuthException();
throw new HttpException(" ",HttpStatus.FORBIDDEN);
return this.appService.getHello();
}
@Get("name")
getName():string
{
return "guozhiqi";
}
}
몇 가지 설명:Usefitlers에서 사용자 정의 이상 처리 클래스를 몇 번 초기화합니까?
답: 저희가 유형을 통해 Appcontroller에 등록한 사용자 정의 이상 클래스는 프로그램이 초기화될 때 한 번만 초기화됩니다.즉, 프로그램이 시작된 후,
controller, 모든method가 정의한 이상 처리 클래스는 이미 확정되었습니다.
만약 우리가 이상을 포착했지만 아무런 처리도 하지 않는다면 무슨 일이 일어날까요?
답: 만약에 우리의 이상 처리 방법이 아무것도 하지 않는다면 축하합니다. 브라우저를 hang사에게 요청하는 데 성공할 것입니다. 이상이 처리되지 않았기 때문에 브라우저는 계속 응답을 받지 못할 것입니다.
여러 개의 이상 사이의 처리 순서는 어떻습니까?
답: 만약에 여러 개의 이상 처리가 모두 이 이상을 포착할 수 있다면 첫 번째 효과만 있다. 즉, 이상 처리 클래스와 중간 부품이 다르기 때문에 이상 처리 클래스는 그 중 하나만 처리할 수 있고 중간 부품은 모두 처리해야 한다.
Nestjs의 @Usefilters는 누구를 닮았습니까?
우선 JS의 관점에서 보면 Angular 같고, 뒷면을 보면 Spring 같다.
Nestjs의 이상 처리는 복잡하지 않습니다. 복잡한 것은 우리가 서로 다른 유형의 이상을 처리하고 이상의 공통성을 추출해야 한다는 것입니다.
참고 문서:docs.nestjs.cn
nestjs의 이상 필터 Exception filter에 대한 구체적인 사용에 관한 이 글은 여기에 소개되었습니다. 더 많은 nest 이상 필터 Exception filter 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
레코드를 업데이트하고 업데이트 전에 동일한 레코드를 삭제하는 방법(nest js & mongoDB)ID로 레코드를 업데이트하고 싶지만 업데이트 전에 동일한 레코드에 이전에 저장된 데이터를 삭제하고 싶습니다. 프로세스는 무엇입니까? 컨트롤러.ts 서비스.ts 나는 이것을 해결하기 위해 이런 식으로 노력하고 있습니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.