GraphQL:错误:模式查询必须是对象类型,但得到:[对象对象]

问题描述:

我目前正在尝试为rootQuery继承模式,以获得更多的模块化。设置目前看起来如下:GraphQL:错误:模式查询必须是对象类型,但得到:[对象对象]

invoiceSchema.js

import { 
    GraphQLObjectType, 
    GraphQLInt, 
} from 'graphql'; 
export default new GraphQLObjectType({ 
    name: 'Invoice', 
    description: 'A monthly billing invoice for an organization', 
    fields:() => ({ 
     amountDue: { 
      type: GraphQLInt, 
      description: 'The amount the card will be charged (total + startingBalance with a min value of 0)' 
     }, 
    }) 
}); 

rootQuery.js

import { 
    GraphQLObjectType, 
    GraphQLString, 
    GraphQLInt, 
    GraphQLList, 
    GraphQLID 
} from 'graphql'; 
import Invoice from './invoiceSchema'; 

export default { 
    Invoice: { 
     type: Invoice, 
     resolve(parentValue, args){ 
      return 'Hello world'; 
     } 
    } 
}; 

schema.js

import query from './rootQuery'; 
import {GraphQLSchema} from 'graphql'; 

export default new GraphQLSchema({query}); 

当试图做到以下几点错误,并希望有一些他LP和洞察力,因为我在invoiceSchema.js中导出的​​显然是ObjectType而不是对象Object。

C:\project\node_modules\graphql\jsutils\invariant.js:19 
    throw new Error(message); 
    ^

Error: Schema query must be Object Type but got: [object Object]. 
    at invariant (C:\project\node_modules\graphql\jsutils\invariant.js:19:11) 
    at new GraphQLSchema (C:\project\node_modules\graphql\type\schema.js:72:88) 
    at Object.<anonymous> (C:/project/api/schema/schema.js:6:16) 
    at Module._compile (module.js:573:30) 
    at loader (C:\project\node_modules\babel-register\lib\node.js:144:5) 
    at Object.require.extensions.(anonymous function) [as .js] (C:\project\node_modules\babel-register\lib\node.js:154:7) 
    at Module.load (module.js:507:32) 
    at tryModuleLoad (module.js:470:12) 
    at Function.Module._load (module.js:462:3) 
    at Module.require (module.js:517:17) 
[nodemon] app crashed - waiting for file changes before starting... 

其实从here上心,我想知道为什么它不工作...

你的根查询需要是GraphQLObjectType一个实例,但是,rootQuery.js是出口简单Object代替。你需要你的出口改变这样的事情:

export default new GraphQLObjectType({ 
    name: 'RootQuery', 
    fields:() => ({ 
    invoice: { 
     type: Invoice, 
     resolve(parentValue, args){ 
      return 'Hello world'; 
     } 
    } 
    }) 
}; 

注:这是常见的做法是把所有的字段名,包括查询和变异的名字,首字母大写,并使用PascalCase类型的名称,以帮助区分他们俩。另外,如果您将模式模块化,则可能会发现使用graphql-tools代替生成模式会很有帮助。海事组织,它使您的架构更具可读性,并有助于避免模块化架构时可能面临的一些更常见的缺陷。该文档有一个很好的例子,说明如何使用makeExecutableSchemahere模块化您的模式。

+0

谢谢!现在使用它:'导出默认的新GraphQLObjectType({0} {0}名称:'RootQuery', 字段:()=>({}; });'然后导致错误'错误:RootQuery .name字段配置必须是一个对象 - 这是奇怪的,因为它引用了查询的名称字符串。也许你也知道如何解决这个问题。 – schlumpfpirat

+0

这里的扩展运算符是不合适的,你基本上把字段设置为你的Invoice类型,这是行不通的,'fields'需要是一个对象或者返回该对象的函数,无论哪种情况,该对象都会将每个字段名映射到另一个对象,该对象包含该字段的详细信息类型','args','解析'等) –

+0

哪个传播运算符? – schlumpfpirat