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-validatorruntypes 这样的库存在的原因。

在运行时所有类型都会丢失,因此控制器接受来自请求正文的任何​​ JSON。如果您想要类型检查,您应该启用利用 class-trasformer and class-validator 库的 ValidationPipe:

app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
      transformOptions: {
        enableImplicitConversion: true,
      },
      validationError: { target: false, value: false },
    })
  );