我有一个代码,其中我在文件中应用了全局验证管道,main.ts
如下所示:
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.enableCors();
// Enable global validation pipe
app.useGlobalPipes(new ValidationPipe({
whitelist: true
}));
}
Run Code Online (Sandbox Code Playgroud)
现在,在我的一个控制器中,我想在补丁请求中跳过 DTO 的某些属性,如下所示
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.enableCors();
// Enable global validation pipe
app.useGlobalPipes(new ValidationPipe({
whitelist: true
}));
}
Run Code Online (Sandbox Code Playgroud)
这是我的 DTO:
@Patch(':id')
// Override the pipes
@UsePipes(new ValidationPipe({
skipMissingProperties: true,
}))
updateProject(@Param('id') accountId: string, @Body() dataToUpdate: UpdateProjectDTO) {
return dataToUpdate;
}
Run Code Online (Sandbox Code Playgroud)
projectDescription
如果它没有作为请求的一部分提交,我想忽略它。但在这种情况下,我的全局管道优先,但它没有skipMissingProperties
定义为其属性的一部分。有没有覆盖全局管道的解决方案?
我正在尝试验证 nestjs 中的嵌套对象数组,它工作正常。但是,如果我发送非数组值(如字符串或空值),则会出现错误:
TypeError: Cannot read property 'length' of undefined.
嵌套字段:
@IsArray()
@ValidateNested({ each: true })
@Type(() => NestedDTO)
nested: NestedDTO[];
Run Code Online (Sandbox Code Playgroud)
如何在验证嵌套对象之前验证该值是一个数组?
版本:
NestJS: 6.10.14
class-validator: 0.11.0
Run Code Online (Sandbox Code Playgroud) 我发现自己尝试使用具有本机 javascript 私有属性 (#) 的装饰器,而这些正在使用的第一个“识别”不起作用。
我通过在值对象的私有属性上使用类验证器装饰器来识别这一点。
我在代码编辑器中收到的错误是:装饰器在这里无效
例子:
import { IsString } from 'class-validator';
Class Person {
@IsString()
#name: string;
constructor(name: string) {
this.#name = name;
}
get name(): string {
return this.#name;
}
}
Run Code Online (Sandbox Code Playgroud) 正如文档中提到的
ValidationPipe 可以自动将有效负载转换为根据其 DTO 类键入的对象。要启用自动转换,请将转换设置为 true。
但我总是收到错误请求,因此转换不起作用。
验证DTO
export class CreateDistrictDto {
@IsString()
@IsNotEmpty()
name: string;
// associations
@IsNotEmpty()
@IsNumber()
cityId: number;
}
Run Code Online (Sandbox Code Playgroud)
控制器中的路线
@Post()
async createCity(@Body() cityDto: CreateCityDto) {
return await this.cityService.createCity(cityDto);
}
Run Code Online (Sandbox Code Playgroud)
main.ts(我使用默认的@nestjs/common ValidationPipe)
app.useGlobalPipes(new ValidationPipe({
transform: true,
}));
Run Code Online (Sandbox Code Playgroud)
这个答案说转换不适用于基元,这似乎是正确的。
/sf/answers/4702707831/ https://github.com/nestjs/nest/blob/master/packages/common/pipes/validation.pipe.ts#L137
那么为什么文档另有说法,transform: true 选项的用途是什么?
假设我有以下路线:
companies/{companyId}/departments/{departmentId}/employees
Run Code Online (Sandbox Code Playgroud)
是否可以分别验证两个资源 id ( companyId
, departmentId
) ?我尝试过关注,但没有成功。
class ResourceId {
@IsNumberString()
@StringNumberRange(...) // my custom validator
id: number;
}
@Get(':companyId/departments/:departmentId/employees')
getEmployees(
@Param('companyId') companyId: ResourceId,
@Param('departmentId') departmentId: ResourceId,
) {}
Run Code Online (Sandbox Code Playgroud)
当单个路由中有多个参数时,我遇到了多种情况。我不想为每条路线创建单独的验证类。有没有办法以不同的方式处理这个问题?
假设我有一个基于文档中示例的类(https://github.com/typestack/class-validator#usage)
import {MinLength, MaxLength, validate} from "class-validator";
export class Post {
@IsString()
body: strong;
@IsString()
title: string;
//...many more fields
public async validate(){
validate(this, { forbidUnknownValues: true, validationError: { target: false } });
}
}
Run Code Online (Sandbox Code Playgroud)
我创建此类的一个实例并向字段分配值。
const post = new Post()
post.body = 'body'
post.title = 'title'
// ... assign all the other fields
Run Code Online (Sandbox Code Playgroud)
我想验证post
,跳过除 之外的所有字段的验证title
。除了将组分配给所有字段之外,似乎没有其他方法可以做到这一点,而我不想这样做。有没有办法只验证这个单一字段?
我需要number 18.2
使用class-validator进行验证。在当前阶段,我知道如何仅验证小数位:
export class PaymentBasicData {
/**
* Transaction amount.
*/
@Expose()
@IsNotEmpty()
@IsNumber({ maxDecimalPlaces: 2 })
@Min(0.01)
@Max(999999999999999999.99)
public amount: number;
}
Run Code Online (Sandbox Code Playgroud)
我应该number
用点前 18 个数字和点后 2 个数字来验证 a 。它应该是什么样子?
考虑自定义验证装饰器部分中提供的示例:
// Decorator definition
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';
export function IsLongerThan(property: string, validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
registerDecorator({
name: 'isLongerThan',
target: object.constructor,
propertyName: propertyName,
constraints: [property],
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
const relatedValue = (args.object as any)[relatedPropertyName];
return typeof value === 'string' && typeof relatedValue === 'string' && value.length > relatedValue.length; // you can return a Promise<boolean> here as well, if you …
Run Code Online (Sandbox Code Playgroud) 将类验证器与 NestJS 一起使用,我想验证用户是否提供了一个或propertyA
一个propertyB
,但他们不需要同时提供两者。
目前,我正在做类似的事情:
export class TestDto {
@ValidateIf(obj => !obj.propertyB)
@IsString()
@IsNotEmpty()
propertyA
@ValidateIf(obj => !obj.propertyA)
@IsString()
@IsNotEmpty()
propertyB
}
Run Code Online (Sandbox Code Playgroud)
如果他们没有提供任何参数,则会出现多个错误,指出propertyA
和propertyB
是必需的并且应该是字符串等。
如果他们不提供这两个属性,我只想要一个错误,例如:“您必须提供 propertyA 或 propertyB。”
这可以使用 NestJS/class-validator 来完成吗?
所以我正在构建一个 API,用户在请求正文中向我们提供,type
可以是value
type
CNIC, EMAIL, MOBILE
现在基于type
我必须验证该值,例如是否EMAIL
有效或是否MOBILE
有效等。
正如我们所看到的,该value
字段依赖于type
验证它的字段。
我需要一种方法来使用class-validator
validationPipe
.
class-validator ×10
typescript ×9
nestjs ×6
javascript ×4
dto ×2
node.js ×2
decorator ×1
private ×1
validation ×1