NestJS 中数据传输 Object 的目的是什么?
What is the purpose of a Data Transfer Object in NestJS?
我遇到了一个问题。我正在关注 NestJS 的文档。 back-end NodeJS 框架。该文档提到了 DTO(数据传输 Object)。我创建了一个用于创建用户的 DTO:
export class CreateUserDto {
readonly email: string;
readonly password: string;
}
结合这个:
@Post('create')
createUser(@Body() userData: CreateUserDto): User {
return this.usersService.createUser(userData);
}
出于某种原因,我可以使用任何类型的 body 向这条路线发出 post 请求。我可以在 body 中放置任何类型的信息而不会出现错误。这样一个 DTO 的重点是只允许 body 中的某些信息,对吧?我没有使用 export class CreateUserDTO,而是尝试了 export interface CreateUserDTO,但这也不起作用。我也是 typescript 和 NestJS 的新手。有没有人可以解释为什么它没有按我预期的方式工作,或者这种数据传输的目的是什么 Object?
DTO 本身更像是开发人员和那些使用 API 的人的指南,以了解请求主体期望的形状,实际上 运行 任何验证 自己 。但是,使用 Typescript,您可以从 class-validator library and and use the built-in ValidationPipe 添加装饰器并对传入请求进行验证 运行,以便只有预期的请求主体可以进入。
简而言之,DTO 是定义请求 应该 的样子,但是因为 JavaScript 是一种动态语言,您可以发送任何内容。这就是像 class-validator
和 runtypes
这样的库存在的原因。
在运行时所有类型都会丢失,因此控制器接受来自请求正文的任何 JSON。如果您想要类型检查,您应该启用利用 class-trasformer and class-validator 库的 ValidationPipe:
app.useGlobalPipes(
new ValidationPipe({
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
validationError: { target: false, value: false },
})
);
我遇到了一个问题。我正在关注 NestJS 的文档。 back-end NodeJS 框架。该文档提到了 DTO(数据传输 Object)。我创建了一个用于创建用户的 DTO:
export class CreateUserDto {
readonly email: string;
readonly password: string;
}
结合这个:
@Post('create')
createUser(@Body() userData: CreateUserDto): User {
return this.usersService.createUser(userData);
}
出于某种原因,我可以使用任何类型的 body 向这条路线发出 post 请求。我可以在 body 中放置任何类型的信息而不会出现错误。这样一个 DTO 的重点是只允许 body 中的某些信息,对吧?我没有使用 export class CreateUserDTO,而是尝试了 export interface CreateUserDTO,但这也不起作用。我也是 typescript 和 NestJS 的新手。有没有人可以解释为什么它没有按我预期的方式工作,或者这种数据传输的目的是什么 Object?
DTO 本身更像是开发人员和那些使用 API 的人的指南,以了解请求主体期望的形状,实际上 运行 任何验证 自己 。但是,使用 Typescript,您可以从 class-validator library and and use the built-in ValidationPipe 添加装饰器并对传入请求进行验证 运行,以便只有预期的请求主体可以进入。
简而言之,DTO 是定义请求 应该 的样子,但是因为 JavaScript 是一种动态语言,您可以发送任何内容。这就是像 class-validator
和 runtypes
这样的库存在的原因。
在运行时所有类型都会丢失,因此控制器接受来自请求正文的任何 JSON。如果您想要类型检查,您应该启用利用 class-trasformer and class-validator 库的 ValidationPipe:
app.useGlobalPipes(
new ValidationPipe({
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
validationError: { target: false, value: false },
})
);