NestJS+Vite+GraphQL开发模式下Schema重复命名报错求助
解决NestJS+Vite+GraphQL开发模式下的Schema重复类型错误
问题分析
开发模式下,Vite的模块加载机制会导致NestJS的GraphQL模块被多次初始化,再加上配置里的autoSchemaFile: 'schema.gql'会生成物理Schema文件,Vite的文件监听会触发Schema重新生成,最终导致GraphQL类型被重复注册,抛出“Schema must contain uniquely named type”错误。而生产环境是构建后单次加载模块,所以不会出现这个问题。
解决方案
方案1:改用内存模式生成Schema
修改GraphQL配置,将autoSchemaFile设为true,让Schema直接在内存中生成,避免物理文件触发的重复解析:
const config: ApolloDriverConfig = { debug: true, playground: true, autoSchemaFile: true, // 切换为内存模式 sortSchema: true, path: "/graphql", cors: { origin: ['*'], }, };
方案2:禁用Vite对Schema文件的监听
如果必须保留物理Schema文件,在vite.config.ts中添加配置,忽略schema.gql的变化监听:
import { defineConfig } from 'vite'; import nestjs from '@nestjs/vite-plugin'; export default defineConfig({ plugins: [nestjs()], server: { watch: { ignored: ['schema.gql'], }, }, });
方案3:手动导入预生成的Schema
先通过生产构建生成schema.gql文件,再手动导入到配置中,避免自动生成时的重复注册:
import { join } from 'path'; import { ApolloDriverConfig } from '@nestjs/apollo'; const config: ApolloDriverConfig = { debug: true, playground: true, typeDefs: join(__dirname, '../schema.gql'), // 手动导入已生成的Schema sortSchema: true, path: "/graphql", cors: { origin: ['*'], }, };
验证
修改配置后重启开发服务器,访问GraphQL Playground,多次刷新页面或发送其他HTTP请求,确认错误不再触发。
内容的提问来源于stack exchange,提问作者SebastianG
相关产品推荐
相关产品推荐

