Nx Monorepo中NestJS GraphQL应用无法生成最新Schema:Mutation未在Playground中显示
看起来你的代码逻辑本身是没问题的,Mutation没出现在Schema里通常是几个常见的配置或缓存问题导致的,下面是几个排查和解决的方向:
1. 注册GraphQL JSON标量类型
你在ExecuteJobInput里使用了graphql-type-json提供的JSON类型,但没有在GraphQL模块中注册这个自定义标量。NestJS无法识别未注册的标量类型时,可能会静默导致Schema生成异常,最终只输出了没有问题的Query部分。
解决方法:在GraphQLModule.forRoot的配置中添加scalarsMap来注册JSON标量,修改后的app.module.ts如下:
import { Module } from '@nestjs/common'; import { GraphQLModule } from '@nestjs/graphql'; import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { ConfigModule } from '@nestjs/config'; import { JobsModule } from './jobs.module'; import { DiscoveryModule } from '@golevelup/nestjs-discovery'; import { PrismaModule } from './prisma/prisma.module'; import JSON from 'graphql-type-json'; // 导入JSON标量 import { join } from 'path'; // 导入path模块用于拼接路径 @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), DiscoveryModule, PrismaModule, GraphQLModule.forRoot<ApolloDriverConfig>({ driver: ApolloDriver, autoSchemaFile: join(process.cwd(), 'apps/jobber-jobs/src/schema.gql'), // 指定具体的Schema生成路径 debug: true, playground: { settings: { 'request.credentials': 'include' }, }, scalarsMap: [ // 注册JSON标量 { type: JSON, scalar: JSON }, ], }), JobsModule, ], }) export class AppModule {}
2. 明确指定Schema文件的生成路径
在Nx Monorepo结构下,autoSchemaFile: true默认会将Schema文件生成在项目根目录,而不是当前应用的src目录中。这会导致Playground加载的是旧的缓存Schema,而非最新生成的包含Mutation的版本。
上面的代码已经通过join(process.cwd(), 'apps/jobber-jobs/src/schema.gql')指定了准确的路径,确保NestJS能正确生成并更新当前应用的Schema文件。
3. 清理Nx缓存并重启服务
Nx的构建缓存可能会复用旧的编译结果,导致新的Resolver代码没有被正确扫描到。运行以下命令清理缓存:
nx reset
之后重启你的应用服务:
nx serve jobber-jobs
4. 验证Resolver的注册正确性
虽然你的代码里已经将JobsResolver添加到了JobsModule的providers数组中,但可以再快速确认两点:
JobsModule确实在AppModule的imports数组中,没有被条件性导入(比如仅在特定环境下导入);JobsResolver上的@Resolver(() => JobMetadata)装饰器配置正确,没有拼写错误。
按照上面的步骤调整后,你的Mutation应该就能正常出现在GraphQL Playground的Schema中了。
内容来源于stack exchange

