首页 > 解决方案 > 从自定义 ValidationPipe 抛出异常时,不会调用 nestjs 异常过滤器

问题描述

我正在尝试使用我的自定义验证管道类“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());

标签: javascriptnode.jstypescriptnestjs

解决方案


我可以通过在 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');
    }
  }
}

推荐阅读