You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:33:28