NX monorepo全栈项目实现跨端共享单一Source of Truth Schema方案咨询
全栈Schema复用可行解决方案
Prisma 与 NestJS GraphQL 兼容方案
typegraphql-prisma官方标注的不兼容仅针对自动生成Resolver功能,仅使用其类型生成能力完全可以适配NestJS,操作步骤如下:
- 安装依赖:将
typegraphql-prisma安装为开发依赖,注意匹配当前@nestjs/graphql内置的TypeGraphQL 1.x版本 - 在Prisma Schema中新增生成器配置,仅开启类型生成,关闭Resolver生成:
generator typegraphql { provider = "typegraphql-prisma" output = "../libs/generated/graphql-types" emitTranspiledCode = true simpleResolvers = false useOriginalMapping = true }
- 执行
prisma generate后会自动生成所有Prisma模型对应的GraphQL ObjectType、输入类型等代码,直接在NestJS Resolver中导入使用即可,无需手动编写返回实体Schema - 输入DTO可以直接复用生成的输入类型,结合class-validator装饰器做字段校验,配合NestJS GraphQL的
decorateAllFields配置项,无需手动为每个字段加@Field装饰器,大幅减少重复代码
客户端Schema共享方案
之前运行报错是因为TypeGraphQL装饰器依赖服务端运行时,不要直接将带TypeGraphQL装饰器的类型导入客户端,调整分层逻辑即可:
- 在NX Monorepo中新建一个通用共享库,仅存放带class-validator装饰器的校验类,不引入任何服务端、GraphQL相关依赖
- 服务端的InputType直接继承该共享校验类,复用校验规则,无需重复编写校验装饰器
- Next.js客户端直接导入该共享校验类,配合React Hook Form的class-validator解析器即可实现表单校验,没有任何服务端依赖,无需调整Webpack配置即可正常运行
极致复用替代方案
如果不想依赖typegraphql-prisma,也可以全链路使用Zod定义Schema:仅编写一次Zod实体规则,通过zod-prisma生成Prisma Schema、zod-to-graphql生成GraphQL类型、客户端直接复用Zod Schema做表单校验,完全实现一处定义全栈复用。
内容的提问来源于stack exchange,提问作者Will Despard
相关产品推荐
相关产品推荐

