GraphQLError:类型查询必须定义一个或多个字段。使用类型鹅

Posted

技术标签:

【中文标题】GraphQLError:类型查询必须定义一个或多个字段。使用类型鹅【英文标题】:GraphQLError: Type Query must define one or more fields. using typegoose 【发布时间】:2020-02-25 16:08:30 【问题描述】:

我尝试在我的项目中实现 typegoose。我正在创建一个 nestjs graphql 服务器并使用 mongoose 将文档推送到我的数据库中。

我尝试使用 typegoose 来简化实现新功能的方式,但我遇到了一个问题,即用 typegoose 转换我的猫鼬“模式”。

让我们看看我的代码

ad.ts

import  buildSchema, getModelForClass, prop  from '@typegoose/typegoose';

export class Ad
  @prop( required: true )
  title: String;

  @prop( required: true )
  description: String;


export const AdModel = getModelForClass(Ad);
export const AdSchema = buildSchema(Ad);

ad.controller.ts

import  Body, Controller, Get, Post  from '@nestjs/common';
import  AdsService  from './ads.service';
import  Ad  from './models/ad';

@Controller('ads')
export class AdsController 
  constructor(private readonly adService: AdsService) 

  @Get()
  async getAds(): Promise<Ad[] | null> 
    return await this.adService.findAll();
  

  @Post()
  async create(@Body() adDto: Partial<Ad>): Promise<Ad> 
    return await this.adService.create(adDto);
  


ad.service.ts

import  Injectable  from '@nestjs/common';
import  InjectModel  from '@nestjs/mongoose';
import  Ad  from './models/ad';
import  ReturnModelType  from '@typegoose/typegoose';

@Injectable()
export class AdsService 

  constructor(
    @InjectModel(Ad.name)
    private readonly adModel: ReturnModelType<typeof Ad>) 

  async create(adDto: Partial<Ad>): Promise <Ad> 
    const createdAd = new this.adModel(adDto);
    return await createdAd.save();
  
  async findAll(): Promise <Ad[]> 
    return await this.adModel.find().exec();
  



ad.module.ts

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';

@Module(
  imports:[MongooseModule.forFeature([ name: Ad.name, schema: AdSchema ])],
  controllers: [AdsController],
  providers: [AdsService],
)
export class AdsModule 

但我收到此错误消息:

错误堆栈跟踪

GraphQLError: Type Query must define one or more fields.
      at SchemaValidationContext.reportError (/home/olivier/www/other/green/back-end/graphql-server/node_modules/graphql/type/validate.js:90:19)
      at validateFields (/home/olivier/www/other/green/back-end/graphql-server/node_modules/graphql/type/validate.js:251:13)
      at validateTypes (/home/olivier/www/other/green/back-end/graphql-server/node_modules/graphql/type/validate.js:226:7)
      at validateSchema (/home/olivier/www/other/green/back-end/graphql-server/node_modules/graphql/type/validate.js:54:3)
      at graphqlImpl (/home/olivier/www/other/green/back-end/graphql-server/node_modules/graphql/graphql.js:79:62)
      at /home/olivier/www/other/green/back-end/graphql-server/node_modules/graphql/graphql.js:28:59
      at new Promise (<anonymous>)
      at Object.graphql (/home/olivier/www/other/green/back-end/graphql-server/node_modules/graphql/graphql.js:26:10)
      at Function.<anonymous> (/home/olivier/www/other/green/back-end/graphql-server/node_modules/type-graphql/dist/schema/schema-generator.js:18:52)
      at Generator.next (<anonymous>)
      at /home/olivier/www/other/green/back-end/graphql-server/node_modules/tslib/tslib.js:110:75
      at new Promise (<anonymous>)
      at Object.__awaiter (/home/olivier/www/other/green/back-end/graphql-server/node_modules/tslib/tslib.js:106:16)
      at Function.generateFromMetadata (/home/olivier/www/other/green/back-end/graphql-server/node_modules/type-graphql/dist/schema/schema-generator.js:15:24)
      at /home/olivier/www/other/green/back-end/graphql-server/node_modules/type-graphql/dist/utils/buildSchema.js:11:65
      at Generator.next (<anonymous>) 
    message: 'Type Query must define one or more fields.'
  
]
(node:1828) UnhandledPromiseRejectionWarning: Error: Generating schema error
    at Function.<anonymous> (/home/olivier/www/other/green/back-end/graphql-server/node_modules/type-graphql/dist/schema/schema-generator.js:20:27)
    at Generator.next (<anonymous>)
    at fulfilled (/home/olivier/www/other/green/back-end/graphql-server/node_modules/tslib/tslib.js:107:62)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
(node:1828) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:1828) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

【问题讨论】:

【参考方案1】:

我想这与 Typegoose 无关。您是否定义了任何 Graphql 类型或查询?如果您将GraphQLModule 添加到应用程序的模块中,则需要有一个正确的.graphql 文件,该文件至少应具有查询类型。

【讨论】:

以上是关于GraphQLError:类型查询必须定义一个或多个字段。使用类型鹅的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GraphQLError 自定义消息?

合并模式后的“GraphQLError:类型中找不到字段:'query_root'”

错误 TS2416:“ApolloError”类型中的属性“originalError”不可分配给基类型“GraphQLError”中的相同属性

GraphQLError:语法错误:无法解析意外字符“\u00A0”

Kotlin 和 Java 中的 RuntimeException 和 GraphQLError

Gatsby 站点地图:GraphQLError:语法错误:预期名称,找到 <EOF>