企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 秘籍 ## CRUD生成器 在一个项目的生命周期中,当我们新增特性的时候,我们通常需要在应用中添加新的资源。这些资源通常需要我们在每次新增资源的时候进行一些重复操作。 ### 介绍 想象一下真实世界中的场景,我们需要通过两个CRUD的终端暴露`User`和`Product`两个实体。参考最佳时间,我们为每个实体进行以下操作。 - 生成一个模块 (nest g mo) 来组织代码,使其保持清晰的界限(将相关模块分组) - 生成一个控制器 (nest g co) 来定义CRUD路径(或者GraphQL应用的查询和变更) - 生成一个服务 (nest g s) 来表示/隔离业务逻辑 - 生成一个实体类/接口来代表资源数据类型 - 生成数据转换对象(或者`GraphQL`应用输入)来决定数据如何通过网络传输 很多步骤! 为了加速执行重复步骤,`Nest CLI`提供了一个生成器(`schematic(原理)`)可以自动生成所有的模板文件以减少上述步骤,同时让开发者感觉更易用。 > 该`schematic`支持生成`HTTP`控制器,`微服务`控制器,`GraphQL`处理器(代码优先或者原理优先),以及`WebSocket`网关等。 ### 生成新资源 在项目根目录下执行以下代码来生成资源。 ```bash $ nest g resource ``` `nest g resource`命令不仅仅生成所有Nestjs构件模块(模块,服务,控制器类)也生成实体类,`DTO`类和测试(.spec)文件。 如下是一个生成的控制器 (`REST API`): ```TypeScript @Controller('users') export class UsersController { constructor(private readonly usersService: UsersService) {} @Post() create(@Body() createUserDto: CreateUserDto) { return this.usersService.create(createUserDto); } @Get() findAll() { return this.usersService.findAll(); } @Get(':id') findOne(@Param('id') id: string) { return this.usersService.findOne(+id); } @Put(':id') update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) { return this.usersService.update(+id, updateUserDto); } @Delete(':id') remove(@Param('id') id: string) { return this.usersService.remove(+id); } } ``` 它也自动生成了所有CRUD终端占位符(REST API路径,GraphQL查询和编译,微服务和WebSocket网关的消息订阅器)--一键所有内容。 > 生成的资源类未与任何特定ORM(或者数据源)绑定,以在任何项目下通用。默认地,所有方法都包含了占位符,允许你用特定项目的数据源填充。类似地,如果你需要生成GraphQL应用的处理器,只要在传输层选择GraphQL(代码优先)或者GraphQL(原理优先)即可。 这里生成一个处理器类而不是一个REST API控制器: ```bash $ nest g resource users > ? What transport layer do you use? GraphQL (code first) > ? Would you like to generate CRUD entry points? Yes > CREATE src/users/users.module.ts (224 bytes) > CREATE src/users/users.resolver.spec.ts (525 bytes) > CREATE src/users/users.resolver.ts (1109 bytes) > CREATE src/users/users.service.spec.ts (453 bytes) > CREATE src/users/users.service.ts (625 bytes) > CREATE src/users/dto/create-user.input.ts (195 bytes) > CREATE src/users/dto/update-user.input.ts (281 bytes) > CREATE src/users/entities/user.entity.ts (187 bytes) > UPDATE src/app.module.ts (312 bytes) ``` > 像这样传递`--no-spec`参数`nest g resource users --no-spec`来避免生成测试文件。 在下面我们可以看到,不仅生成了所有变更和查询的样板文件,也把他们绑定到了一起,我们可以使用`UsersService`, `User Entity`, 和`DTO`。 ```TypeScript import { Resolver, Query, Mutation, Args, Int } from '@nestjs/graphql'; import { UsersService } from './users.service'; import { User } from './entities/user.entity'; import { CreateUserInput } from './dto/create-user.input'; import { UpdateUserInput } from './dto/update-user.input'; @Resolver(() => User) export class UsersResolver { constructor(private readonly usersService: UsersService) {} @Mutation(() => User) createUser(@Args('createUserInput') createUserInput: CreateUserInput) { return this.usersService.create(createUserInput); } @Query(() => [User], { name: 'users' }) findAll() { return this.usersService.findAll(); } @Query(() => User, { name: 'user' }) findOne(@Args('id', { type: () => Int }) id: number) { return this.usersService.findOne(id); } @Mutation(() => User) updateUser(@Args('updateUserInput') updateUserInput: UpdateUserInput) { return this.usersService.update(updateUserInput.id, updateUserInput); } @Mutation(() => User) removeUser(@Args('id', { type: () => Int }) id: number) { return this.usersService.remove(id); } } ```