【问题标题】:nestjs exception filter is not invoked when exception is thrown from Custom ValidationPipe从自定义 ValidationPipe 抛出异常时,不会调用 nestjs 异常过滤器
【发布时间】:2021-11-05 15:53:46
【问题描述】:

我正在尝试使用我的自定义验证管道类“SchemaValidationPipe”验证我的 Nestjs 应用程序中的 json 请求,该类会引发 BadRequestException。我的全局异常过滤器没有捕捉到从验证管道抛出的异常。

如果我从控制器类抛出异常,则全局异常过滤器能够捕获异常。

@Injectable()
export class SchemaValidationPipe implements PipeTransform<any> {
  constructor(private schema: any) {}

   transform(value: any, metadata: ArgumentMetadata) {
    const schemaValidator = new JsonValidator(this.schema);
    schemaValidator
      .validate(value)
      .then((data) => {
        if (data) {
          const { isValid, message } = data;
          if(!isValid) throw new BadRequestException( { status : '500', message : 'Validation failed' } );
        }
        return Promise.resolve(value);
      })
      .catch((err) => {
        throw new BadRequestException('Validation failed');
      });
  }
}
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter<HttpException> {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();

    const status = exception.getStatus();

    response.status(status).json({
      statusCode: status,
      timestamp: new Date().toISOString(),
      path: request.url,
    });
  }
}
const app = await NestFactory.create<NestExpressApplication>(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());

【问题讨论】:

    标签: javascript node.js typescript nestjs


    【解决方案1】:

    看起来您没有从 validate 方法返回提供,因此它被视为无效。这意味着 Promise 将在绑定请求生命周期之外运行,最终可能会引发未处理的提供拒绝。你应该只需要添加return schemaValidator.validate...

    【讨论】:

      【解决方案2】:

      我可以通过在 SchemaValidationPipe 类中将转换方法设为异步来解决问题

      @Injectable()
      export class SchemaValidationPipe implements PipeTransform<any> {
        constructor(private schema: any) {}
      
         async transform(value: any, metadata: ArgumentMetadata) {
          const schemaValidator = new JsonValidator(this.schema);
          try {
            const { isValid, message } =  await schemaValidator.validate(value);
            if(!isValid) throw new BadRequestException(  'Validation failed'  );
          } catch (err) {
            throw new BadRequestException('Validation failed');
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-04-20
        • 2022-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-17
        • 2011-05-30
        • 2017-06-29
        • 2011-10-06
        相关资源
        最近更新 更多