本文档介绍了 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() 装饰的方法的类。
来源:sample/23-graphql-code-first/package.json
Input types 是用于 mutation 参数的特殊对象类型。它们使用 @InputType() 装饰器进行定义。
然后,您可以在 mutation resolvers 中使用这些 input types
来源:sample/23-graphql-code-first/package.json
字段 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
代码优先方法会自动从您的 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 ORM 集成,以实现高效的数据库操作。
定义您的 Prisma schema (schema.prisma)
生成 Prisma Client
来源:sample/22-graphql-prisma/package.json
NestJS 支持使用代码优先方法进行 GraphQL Federation,允许您构建分布式的 GraphQL 架构。
来源: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
代码优先方法提供了多种优势
| 功能 | 代码优先 | 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 支持。