[我有一个使用通行证的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;
}
}
我不想做的就是将上述(或服务)修改为黑名单/白名单类型,因为随着应用程序的发展,它们将迅速变化,因此将它们添加到此类列表中将是一个很大的痛苦点。 。
制作a PR with a change that was supposed to fix this后,似乎对于我的特定问题,我可以使用metadata.type,如下所示:
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> {
if (metadata.type !== 'custom') {
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;
}
}
而且所讨论的公关甚至都没有按照我的想法去做,因此它也不起作用。