【发布时间】:2020-03-04 05:04:57
【问题描述】:
我有一个使用护照的 NestJS 应用程序,我想添加一个 @User 参数装饰器以更轻松地让用户进入请求,类似于 this example。
但是,我还有一个全局验证管道,我将其应用于所有传入请求(正文、标头、查询字符串),并根据声明的正文/查询/标头类型应用不同的验证。出于某种原因,当使用 createParamDecorator() 函数时,NestJS 将验证器应用于 req.user 对象。然而那是错误的。护照用户不是请求内容的一部分,因此不应这样验证。
没有复制和粘贴createParamDecorator() 的源代码,并去掉了应用管道的行,有没有办法关闭管道,或者至少让我的验证管道忽略与请求无关的类型?
我的验证管道,供参考:
import { ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
import { ValidationService } from './validation.service';
@Injectable()
export class ValidationPipe<T extends unknown> implements PipeTransform {
public constructor(private readonly service: ValidationService) {}
public async transform(value: T, metadata: ArgumentMetadata): Promise<T> {
const className: string | undefined = metadata.metatype && metadata.metatype.name;
if (className) {
const errors = await this.service.validate(value, className);
if (errors && errors.length > 0) {
throw new BadRequestException(errors);
}
}
return value;
}
}
我不想要的一件事是将上述(或服务)修改为黑名单/白名单类型,因为这些类型会随着应用程序的发展而迅速变化,因此将它们添加到此类中将是一个很大的痛点列表。
【问题讨论】: