javascript - 从自定义 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());
解决方案
我可以通过在 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');
}
}
}
推荐阅读
- php - preg_match_all 获取表达式的结尾
- excel - 我想将excel与黄瓜集成。只是传递工作簿名称
- routes - BGP会话中接收路由的配额和限制
- asp.net-mvc - 将 Click Once 上传到应用服务会导致此错误:应用程序清单的计算哈希值与指定的哈希值不同或没有哈希值
- sql - CTE的执行:在选择列表中无效
- javascript - 将函数的返回值存储在javascript中的变量中
- pythonpath - 由于 python 路径问题,我无法在 vscode (mac) 中调试我的脚本
- php - 如何计算复选框的值?
- r - 如何使用 RVEST 从网站抓取超链接?
- node.js - 在 CentOS7 上安装 Angular 时出错