1

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

我正在关注教程

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

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 类,然后使用绑定到我的创建函数Res()Body()或者嵌套在幕后做了一些魔术,因为他们从未声明要在文档中导入它?

谢谢。

4

1 回答 1

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
}

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

于 2018-03-15T10:32:51.633 回答