【问题标题】:GraphQL: Error: Schema query must be Object Type but got: [object Object]GraphQL:错误:模式查询必须是对象类型,但得到:[对象对象]
【发布时间】:2018-02-23 02:31:14
【问题描述】:

我目前正在尝试继承 rootQuery 的架构以获得更多的模块化。目前的设置如下:

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});

当尝试执行以下错误并希望获得一些帮助和见解时,因为我在 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 那里得到的想法,我想知道为什么它不起作用...

【问题讨论】:

    标签: graphql


    【解决方案1】:

    您的根查询需要是GraphQLObjectType 的实例,但是rootQuery.js 正在导出一个普通对象。您需要将导出更改为以下内容:

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

    注意:通常的做法是将所有字段名称(包括查询和变异名称)保留在驼峰式格式中,并使用 PascalCase 作为类型名称,以帮助区分两者。

    另外,如果您正在模块化您的架构,您可能会发现使用graphql-tools 来生成您的架构会有所帮助。 IMO,它使您的模式更具可读性,并有助于避免在模块化模式时可能面临的一些更常见的陷阱。文档中有一个很好的示例,说明如何使用 makeExecutableSchema here 模块化架构。

    【讨论】:

    • 谢谢!现在按如下方式使用它:export default new GraphQLObjectType({ name: 'RootQuery', fields: () =&gt; ({ ...Invoice }) }; 然后导致错误Error: RootQuery.name field config must be an object - 这很奇怪,因为它引用了查询名称的字符串。也许你也知道如何解决这个问题。
    • 传播运算符不合适。您基本上将字段设置为您的发票类型,这将不起作用。 fields 需要是一个对象,或者是一个返回该对象的函数。在任何一种情况下,该对象都会将每个字段名称映射到另一个包含该字段详细信息的对象(如typeargsresolve 等)
    • { ...Invoice }
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2015-09-13
    相关资源
    最近更新 更多