我有一个使用通行证的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;
}
}
我不想做的一件事就是将上面的(或服务)修改为黑名单/白名单类型,因为随着应用程序的发展,它们将迅速变化,因此将它们添加到此类列表中将是一个很大的痛苦点。列表。
答案 0 :(得分:0)
制作a PR with a change that was supposed to fix this后,对于我的特定问题,我可以使用meta.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;
}
}
有问题的公关甚至没有按照我的想法去做,所以它也不起作用。