在 Nest JS 中导入 dto class

Importing dto class in Nest JS

我正在尝试使用 DTO 为我的控制器在 Nest.js 中定义我的数据。

我正在关注tutorial

我在 src/controllers/cats/dto/create-cat.dto.js

内创建了我的 DTO
export class CreateCatDto {
  readonly name: string;
  readonly age: number;
  readonly breed: string;
}

不过,我对如何将其导入应用程序感到困惑。该文档实际上并没有说明它需要导入,所以我假设 nest 在幕后做了一些魔术?尽管我有一种感觉,情况并非如此。

我正在尝试将其直接导入到我的控制器中:

import { CreateCatDto } from './dto/create-cat.dto';

但这会引发错误:

Unexpected token (2:11)
  1 | export class CreateCatDto {
> 2 |   readonly name: string;
    |            ^
  3 |   readonly age: number;
  4 |   readonly breed: string;
  5 | }

DTO 代码是直接从嵌套文档中提取的,因此代码不应有任何问题(虽然 readonly name: string; 看起来不像 javascript 我以前遇到过的) .

作为参考,这是我尝试使用 DTO 的猫控制器的其余部分

import { Controller, Bind, Get, Post, Body, Res, HttpStatus } from '@nestjs/common';
// import { CreateCatDto } from './dto/create-cat.dto';

@Controller('cats')
export class CatsController {

  @Post()
    @Bind(Res(), Body())
    async create(res, body, createCatDto) {
        console.log("createCatDto", createCatDto)
        res.status(HttpStatus.CREATED).send();
    }

  @Get()
  findAll() {
    return [];
  }
}

是否需要导入 DTO class 然后使用绑定到我的创建函数,如 Res()Body() 或者 nest 在幕后做一些魔术,因为它们从不声明将其导入那里的文档?

谢谢。

快速回答:您不能在 JavaScript ES6

中使用 DTO

不太长的答案:这是文档的摘录,刚刚介绍了 DTO。

Firstly, we need to establish the DTO (Data Transfer Object) schema. A DTO is an object that defines how the data will be sent over the network. We could do this by using TypeScript interfaces, or by simple classes.

如您所见,它在那里用作接口以提供静态类型。你真的不能在 JS 中使用 DTO,因为 interfaceStatic typing 不是 ES6 标准的一部分。

你应该跳过 ES6 的 DTO 部分并使用 @Body() 参数来代替

@Post()
@Bind(Body())
async create(createCatDto) {
    // TODO: Add some logic here
}

我的建议:尝试考虑转向 Typescript 以充分利用 NestJS。