Exception NestJS:异常处理的最佳实践(异常过滤器与拦截器.catchError)

Exception NestJS:异常处理的最佳实践(异常过滤器与拦截器.catchError),exception,exception-handling,nestjs,Exception,Exception Handling,Nestjs,使用over的优缺点是什么。(异常映射)?不确定您是否已经得到了答案,但就我的实现而言,以下场景使用过滤器或拦截器 异常过滤器: 异常过滤器是一种捕获应用程序抛出的错误的机制,无论是在加载模块还是启动请求时,它们都是捕获问题(尤其是运行时错误)的最佳方案 考虑一个场景,其中您已经实现的自定义记录器服务(例如pino记录器服务)具有如下修订路径: (注意:loggerService应该已经定义了实现的方法。现在,我将留空) 这是一个示例编校path:[req.headers[“Contet typ

使用over的优缺点是什么。(异常映射)?

不确定您是否已经得到了答案,但就我的实现而言,以下场景使用过滤器或拦截器

异常过滤器:

异常过滤器是一种捕获应用程序抛出的错误的机制,无论是在加载模块还是启动请求时,它们都是捕获问题(尤其是运行时错误)的最佳方案

考虑一个场景,其中您已经实现的自定义记录器服务(例如pino记录器服务)具有如下修订路径: (注意:loggerService应该已经定义了实现的方法。现在,我将留空)

这是一个示例编校
path:[req.headers[“Contet typr”]
现在,编校路径显然是不正确的,但无法确定,除非制定了特定的req,并且在某个地方实现了记录器

考虑一个场景,其中存在设置为全局拦截器的拦截器(例如日志拦截器)。下面的一个是日志拦截器,它尝试对“content type”头进行编校,但由于编校数组路径不正确,这将导致引发运行时异常

@Injectable()
export class LoggingInterceptor implements NestInterceptor{
    constructor(private readonly logService: PinoLoggerService) {

    }

    intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>> {
        const headers = context.switchToHttp().getRequest().headers;
        console.log('Logging the incoming req', headers);
        return next.handle();
    }

}
@Injectable()
导出类LoggingInterceptor实现NestInterceptor{
构造函数(专用只读日志服务:PinoLoggerService){
}
拦截(context:ExecutionContext,next:CallHandler):可观察的承诺{
const headers=context.switchToHttp().getRequest().headers;
log('记录传入的请求',标题);
返回next.handle();
}
}
捕获这些异常的方法是通过异常过滤器,而不是通过Interceptor.catchError

export class CustomExceptionFilter implements ExceptionFilter {
    catch(exception: any, host: ArgumentsHost): any {
        console.log('coming in first filter');
        const errModel = new ErrorModel('AppErrorType');
        errModel.name = exception.name;
        errModel.errorMessage = exception.message;
        errModel.errorCode = '500';
        errModel.errorFields = null;
        errModel.reason = 'Internal server failure';
        errModel.stack = exception.stack;
        exception['errorModel'] = errModel;
        console.log('exce:', exception);
        const reply: FastifyReply<any> = host.switchToHttp().getResponse();
        reply.send({error: errModel}).status(parseInt(errModel.errorCode));
    }

}
导出类CustomExceptionFilter实现ExceptionFilter{
catch(异常:any,主机:ArgumentsHost):any{
log('进入第一个过滤器');
const errModel=new ErrorModel('AppErrorType');
errModel.name=exception.name;
errModel.errorMessage=异常.message;
errModel.errorCode='500';
errModel.errorFields=null;
errModel.reason='内部服务器故障';
errModel.stack=exception.stack;
异常['errorModel']=errModel;
console.log('exce:',异常);
const reply:fastfyreply=host.switchToHttp().getResponse();
reply.send({error:errModel}).status(parseInt(errModel.errorCode));
}
}
希望这有帮助

export class CustomExceptionFilter implements ExceptionFilter {
    catch(exception: any, host: ArgumentsHost): any {
        console.log('coming in first filter');
        const errModel = new ErrorModel('AppErrorType');
        errModel.name = exception.name;
        errModel.errorMessage = exception.message;
        errModel.errorCode = '500';
        errModel.errorFields = null;
        errModel.reason = 'Internal server failure';
        errModel.stack = exception.stack;
        exception['errorModel'] = errModel;
        console.log('exce:', exception);
        const reply: FastifyReply<any> = host.switchToHttp().getResponse();
        reply.send({error: errModel}).status(parseInt(errModel.errorCode));
    }

}