在 Nest JS 中导入 dto 类

Str*_*ch0 1 javascript node.js nestjs

在此处输入图片说明我正在尝试使用 DTO 为 Nest.js 中的控制器定义我的数据。

我正在学习教程

我已经在其中创建了我的 DTO src/controllers/cats/dto/create-cat.dto.js

export class CreateCatDto {
  readonly name: string;
  readonly age: number;
  readonly breed: string;
}
Run Code Online (Sandbox Code Playgroud)

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

我想直接在我的控制器中导入它:

import { CreateCatDto } from './dto/create-cat.dto';
Run Code Online (Sandbox Code Playgroud)

但这会引发错误:

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

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 [];
  }
}
Run Code Online (Sandbox Code Playgroud)

是否需要导入 DTO 类,然后使用 bind 到我的 create 函数,例如Res()Body()或 nest 在幕后做了一些魔术,因为他们从未声明要在那里的文档中导入它?

谢谢。

ore*_*rin 6

快速回答:你不能在 JavaScript ES6 中使用 DTO

不长答案:这是文档的摘录,刚刚引入了 DTO。

首先,我们需要建立 DTO(数据传输对象)模式。DTO 是定义如何通过网络发送数据的对象。我们可以通过使用 TypeScript 接口或简单的类来做到这一点。

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

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

@Post()
@Bind(Body())
async create(createCatDto) {
    // TODO: Add some logic here
}
Run Code Online (Sandbox Code Playgroud)

我的建议:尝试考虑迁移到 Typescript 以充分利用 NestJS。