增删改查生成器
增删改查生成器
在项目的整个生命周期中,当我们构建新功能时,我们经常需要向我们的应用添加新资源。这些资源通常需要多次重复操作,我们每次定义新资源时都必须重复这些操作。
生成实体
让我们想象一个现实场景,我们需要公开 2 个实体的 CRUD 端点,比如说用户和产品实体。按照最佳实践,对于每个实体,我们必须执行多项操作,如下所示
- 生成模块 (
nest g mo [文件名称]
) 以保持代码井井有条并建立清晰的边界(对相关组件进行分组) - 生成控制器 (
nest g co [文件名称]
) 来定义 CRUD 路由(或 GraphQL 应用的查询/变更) - 生成服务 (
nest g s [文件名称]
) 以实现和隔离业务逻辑
可使用--no-spec
来避免生成测试文件,如下所示:nest g mo users --no-spec
生成新资源
要创建新资源,只需在项目的根目录中运行以下命令
nest g resource [文件名称]
注意
为了避免生成测试文件,你可以传递 --no-spec 标志,如下所示:nest g resource users --no-spec
nest g resource
命令不仅生成所有 NestJS 构建块(模块、服务、控制器类),还生成实体类\DTO 类以及测试 (.spec) 文件。
你可以在下面看到生成的控制器文件(用于 REST API)
@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);
}
@Patch(':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 (code first)(或 GraphQL (schema first))作为你的传输层。
在这种情况下,NestJS 将生成一个解析器类而不是 REST API 控制器
$ 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)
我们可以在下面看到,不仅创建了所有样板变更和查询,而且所有内容都绑定在一起。我们正在使用 UsersService、User 实体和我们的 DTO。
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);
}
}