菜单

代码优先方法

相关源文件

目的与范围

本文档介绍了 NestJS 中 GraphQL 实现的代码优先方法。使用此方法,开发人员可以使用 TypeScript 类和装饰器定义 GraphQL schema,然后 NestJS 会自动将其转换为 GraphQL schema 定义。有关使用 SDL 文件的替代方案——Schema-First 方法,请参阅 Schema-First 方法

概述

代码优先方法利用 TypeScript 的类型系统和装饰器,使用熟悉的面向对象编程模式来定义 GraphQL schema。此方法提供强类型、IDE 自动补全以及通过消除对单独 schema 定义文件的需求来减少样板代码。

来源:sample/23-graphql-code-first/package.json, sample/22-graphql-prisma/package.json

设置和配置

要使用代码优先方法,您需要在 NestJS 应用程序中安装必要的依赖项并配置 GraphQL 模块。

安装

模块配置

在应用程序的主模块中配置 GraphQLModule

来源:sample/23-graphql-code-first/package.json, sample/22-graphql-prisma/package.json

定义对象类型

在代码优先方法中,GraphQL 对象类型被定义为带有 @ObjectType() 装饰器的 TypeScript 类。

基本对象类型定义

@Field() 装饰器将类属性标记为 GraphQL 字段。您可以指定返回类型、可空性和其他选项。

来源:sample/23-graphql-code-first/package.json

解析器

Resolvers 为获取 GraphQL schema 数据提供逻辑。在代码优先方法中,resolvers 是带有被 @Query()@Mutation()@Subscription() 装饰的方法的类。

基本 Resolver

来源:sample/23-graphql-code-first/package.json

输入类型

Input types 是用于 mutation 参数的特殊对象类型。它们使用 @InputType() 装饰器进行定义。

然后,您可以在 mutation resolvers 中使用这些 input types

来源:sample/23-graphql-code-first/package.json

字段 Resolver 函数

字段 resolvers 允许您解析对象类型的单个字段,这些字段可能需要自定义逻辑。

来源:sample/23-graphql-code-first/package.json

类型继承

代码优先方法支持类型继承,允许您扩展 GraphQL 类型。

来源:sample/23-graphql-code-first/package.json

接口和联合类型

接口

GraphQL 接口使用 @InterfaceType() 装饰器进行定义。

联合类型

联合类型使用 createUnionType() 函数进行定义。

来源:sample/23-graphql-code-first/package.json

枚举

GraphQL 枚举类型使用带有 @registerEnumType() 函数的 TypeScript 枚举类型进行定义。

在您的对象类型中

来源:sample/23-graphql-code-first/package.json

Schema 生成

代码优先方法会自动从您的 TypeScript 代码生成 GraphQL schema。

配置选项

GraphQLModule.forRoot() 方法接受几个用于 schema 生成的选项

来源:sample/23-graphql-code-first/package.json, sample/22-graphql-prisma/package.json

验证

代码优先方法与 class-validator 结合用于输入验证效果很好。

要启用自动验证,请更新您的应用程序配置

来源:sample/23-graphql-code-first/package.json

字段中间件

字段中间件允许您拦截和修改字段解析逻辑。

来源:sample/23-graphql-code-first/package.json

代码优先与 Prisma

代码优先方法可以与 Prisma ORM 集成,以实现高效的数据库操作。

与 Prisma 的设置

  1. 安装 Prisma
  1. 初始化 Prisma
  1. 定义您的 Prisma schema (schema.prisma)

  2. 生成 Prisma Client

  1. 创建 Prisma 服务
  1. 在您的 resolvers 中使用 Prisma

来源:sample/22-graphql-prisma/package.json

Federation 与代码优先方法

NestJS 支持使用代码优先方法进行 GraphQL Federation,允许您构建分布式的 GraphQL 架构。

设置 Federation 子图

Federation 装饰器

来源:sample/31-graphql-federation-code-first/users-application/package.json, sample/31-graphql-federation-code-first/posts-application/package.json, sample/31-graphql-federation-code-first/gateway/package.json

代码优先方法的优势

代码优先方法提供了多种优势

  1. 类型安全:利用 TypeScript 的类型系统
  2. 单一事实来源:无需维护单独的 schema 文件
  3. IDE 支持:更好的自动补全和内联文档
  4. 代码复用:能够复用和扩展类型
  5. 验证集成:与 class-validator 无缝协作
  6. 减少样板代码:无需单独的类型定义
  7. 重构支持:TypeScript 重构工具效果很好

与 Schema-First 的比较

功能代码优先Schema-First
定义使用 TypeScript 类和装饰器使用 GraphQL SDL 文件
类型安全TypeScript 强类型需要手动生成类型
Schema 生成代码自动生成手动创建
学习曲线对 GraphQL 初学者来说门槛较高对 GraphQL 初学者更直观
与TypeScript集成无缝集成需要额外的工具
IDE 支持优秀对 SDL 文件支持有限
灵活性对于复杂 schema 灵活性较低对于自定义指令更灵活
向后兼容性维护难度大维护更容易

来源:sample/23-graphql-code-first/package.json, sample/12-graphql-schema-first/package.json

结论

NestJS 中 GraphQL 的代码优先方法提供了一种类型安全且对开发人员友好的方式来构建 GraphQL API。通过利用 TypeScript 的类型系统和装饰器,开发人员可以以一种符合面向对象编程习惯的方式定义其 GraphQL schema。自动 schema 生成减少了样板代码,并确保了 TypeScript 代码和 GraphQL schema 之间的类型一致性。

选择代码优先还是 Schema-First 取决于您团队的偏好、现有代码库和具体需求。代码优先方法尤其适合以 TypeScript 为主的项目,这些项目优先考虑类型安全和 IDE 支持。