NestJS集成Typegoose遇GraphQL错误:Type Query需定义字段
解决NestJS GraphQL + Typegoose的"Type Query must define one or more fields"错误
首先咱们明确错误根源:你看到的Type Query must define one or more fields,是因为项目已经配置了GraphQL模块,但没有定义任何GraphQL查询(Query)或变更(Mutation)字段。当前代码只有REST风格的Controller,而GraphQL需要专门的Resolver来定义对应的操作,导致Schema验证失败。
下面是完整的修复步骤:
1. 给Ad类补充TypeGraphQL装饰器
要让Typegoose模型同时成为GraphQL的对象类型,需要给类和字段添加TypeGraphQL的装饰器:
// ad.ts import { buildSchema, getModelForClass, prop } from '@typegoose/typegoose'; import { ObjectType, Field, ID } from 'type-graphql'; // 标记为GraphQL对象类型 @ObjectType() export class Ad{ // 将MongoDB的_id暴露为GraphQL的ID类型 @Field(() => ID) _id: string; // 标记该字段在GraphQL Schema中可见 @Field() @prop({ required: true }) title: string; // 用TypeScript基础类型string而非包装类型String @Field() @prop({ required: true }) description: string; } export const AdModel = getModelForClass(Ad); export const AdSchema = buildSchema(Ad);
2. 创建GraphQL Resolver
Resolver是处理GraphQL查询和变更的核心,新建ads.resolver.ts:
import { Query, Mutation, Args, Resolver } from '@nestjs/graphql'; import { AdsService } from './ads.service'; import { Ad } from './models/ad'; @Resolver(() => Ad) export class AdsResolver { constructor(private readonly adService: AdsService) {} // 定义GraphQL查询:获取所有广告 @Query(() => [Ad]) async ads(): Promise<Ad[]> { return this.adService.findAll(); } // 定义GraphQL变更:创建新广告 @Mutation(() => Ad) async createAd(@Args('adDto') adDto: Partial<Ad>): Promise<Ad> { return this.adService.create(adDto); } }
3. 在AdsModule中注册Resolver
修改ad.module.ts,把Resolver添加到providers数组:
import { Module } from '@nestjs/common'; import { AdsService } from './ads.service'; import { MongooseModule } from '@nestjs/mongoose'; import { Ad, AdSchema } from './models/ad'; import { AdsController } from './ads.controller'; import { AdsResolver } from './ads.resolver'; // 导入Resolver @Module({ imports:[MongooseModule.forFeature([{ name: Ad.name, schema: AdSchema }])], controllers: [AdsController], // 保留REST控制器(如果需要的话) providers: [AdsService, AdsResolver], // 添加Resolver }) export class AdsModule {}
4. 配置根模块的GraphQL模块
确保根模块(比如AppModule)正确配置GraphQL:
import { Module } from '@nestjs/common'; import { GraphQLModule } from '@nestjs/graphql'; import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { AdsModule } from './ads/ads.module'; @Module({ imports: [ GraphQLModule.forRoot<ApolloDriverConfig>({ driver: ApolloDriver, autoSchemaFile: 'schema.gql', // 自动生成Schema文件(内存中生成可设为true) playground: true, // 开启Playground方便测试GraphQL }), AdsModule, ], }) export class AppModule {}
额外注意事项
- 确保已安装所有必要依赖:
@nestjs/graphql、@nestjs/apollo、graphql、apollo-server-express、type-graphql - TypeScript中优先使用基础类型(如
string、number)而非包装对象(String、Number),避免类型兼容问题 - 若不需要REST接口,可以删除
AdsController,专注于GraphQL Resolver
内容的提问来源于stack exchange,提问作者Mantalo
相关产品推荐
相关产品推荐

