我正在尝试使用DTO在Nest.js中为我的控制器定义数据。
我正在关注tutorial
我在src/controllers/cats/dto/create-cat.dto.js
export class CreateCatDto {
readonly name: string;
readonly age: number;
readonly breed: string;
}
我对如何将其导入应用程序感到困惑。文档实际上并没有声明它需要导入所以我认为嵌套在幕后做了一些魔术?虽然我有一种感觉但事实并非如此。
我正在尝试直接在我的控制器中导入它:
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()
,或者嵌套在场景后面做了一些魔术,因为他们从未声明在那里导入它?
感谢。
答案 0 :(得分:3)
快速回答:您无法在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。