【问题标题】:GraphQL Error field type must be Input Type but got:GraphQL 错误字段类型必须是输入类型,但得到:
【发布时间】:2018-01-30 01:48:05
【问题描述】:

这里是突变:

const createNotebook = mutationWithClientMutationId ({
    name: 'CreateNotebook',
    inputFields: {
        token: {
            type: GraphQLString,
        },

        details: {
            type: NotebookDetails,
        },
    },
    outputFields: {

    },
    async mutateCRNotebook(input, context) {
        const data = getJSONFromRelativeURL(input.token);

    },
});

这是突变的详细信息字段中使用的模式:

const NotebookDetails = new GraphQLObjectType({
    name: 'NotebookDetails',
    interfaces: [nodeInterface],

    fields: () => ({
        id: globalIdField('NotebookDetails'),

        description: {
            type: GraphQLString,
            description: '...',
            resolve(obj) {
                return obj.description;
            },
        },

        language: {
            type: GraphQLString,
            description: '...',
            resolve(obj) {
                return obj.language;
            },
        },

    }),

});

我在运行此代码时遇到的错误是:

api_1    | Error: CreateNotebookInput.details field type must be Input Type but got: NotebookDetails.
api_1    |     at invariant (/usr/src/app/node_modules/graphql/jsutils/invariant.js:19:11)
api_1    |     at /usr/src/app/node_modules/graphql/type/definition.js:698:58
api_1    |     at Array.forEach (native)
api_1    |     at GraphQLInputObjectType._defineFieldMap (/usr/src/app/node_modules/graphql/type/definition.js:693:16)
api_1    |     at GraphQLInputObjectType.getFields (/usr/src/app/node_modules/graphql/type/definition.js:682:49)
api_1    |     at typeMapReducer (/usr/src/app/node_modules/graphql/type/schema.js:224:26)
api_1    |     at typeMapReducer (/usr/src/app/node_modules/graphql/type/schema.js:190:12)
api_1    |     at Array.reduce (native)
api_1    |     at /usr/src/app/node_modules/graphql/type/schema.js:217:36
api_1    |     at Array.forEach (native)
api_1    |     at typeMapReducer (/usr/src/app/node_modules/graphql/type/schema.js:210:27)
api_1    |     at Array.reduce (native)
api_1    |     at new GraphQLSchema (/usr/src/app/node_modules/graphql/type/schema.js:98:34)
api_1    |     at Object.<anonymous> (/usr/src/app/src/schema/index.js:39:16)
api_1    |     at Module._compile (module.js:569:30)
api_1    |     at Object.Module._extensions..js (module.js:580:10)

我已经在查询中使用了这种语法并且它们工作正常。但是,他们正在返回带有突变的错误。 我的代码中有什么不正确的地方,我该如何纠正?

【问题讨论】:

    标签: javascript graphql


    【解决方案1】:

    在 GraphQL 中,input 不能用作typetype 不能用作input。不幸的是,即使字段看起来与现有类型相同,您也始终必须定义单独的输入以用作参数。试试这样的:

    const NotebookDetailsInput = new GraphQLInputObjectType({
      name: 'NotebookDetailsInput',
      fields: () => ({
        id:          { type: GraphQLID },
        description: { type: GraphQLString },
        language:    { type: GraphQLString }, 
      })
    });
    

    如果使用 SDL,相同的类型将如下所示:

    input {
      id: ID
      description: String
      language: String
    }
    

    请参阅this answer,详细了解为什么需要这样做。

    【讨论】:

    • 这花了我太长时间才明白,但一旦你明白了,似乎很“明显”!
    【解决方案2】:

    对于那些使用 graphql-tools 并偶然发现这篇文章的人,GraphQL 网站上的文档是 here

    我使用 graphQL 工具的示例在这里下面:(这在输入 AKA 中有一个输入,ImageInputSocialPostInput 内)

    //变异文件

    extend type Mutation {
        SchedulePost ( 
            socialPost: SocialPostInput,
            schedule: ScheduleInput
         ): ScheduledPost
    }`
    

    //日程安排和SocialPost文件

    type Image {
        id: String
        url: String
    }
    type SocialPost {
        id: String
        GCID: String
        message: String
        image: Image
    }
    input ImageInput {
        url: String
    }
    input SocialPostInput {
        GCID: String
        message: String
        image: ImageInput
    }
    type Schedule {
        id: String
        month: Int
        date: Int
        hour: Int
        minute: Int
    }
    input ScheduleInput {
        id: String
        month: Int
        date: Int
        hour: Int
        minute: Int
    }`
    

    【讨论】:

      【解决方案3】:

      如果您在 schema.graphql 文件中描述架构,只需将类型替换为输入:

      错误:

      type SomeData {
        someField: String!
      }
      

      对:

      input SomeData {
        someField: String!
      }
      

      【讨论】:

      • 我按照你的回答@zemil,它对我有用。谢谢你。我的问题是:我有一个大型模式语言,我必须克隆类型以使其成为输入。是否有现有的选项可以最小化它的冗余,因为它们唯一的区别是类型/输入代码,字段都是一样的。
      【解决方案4】:

      这是突变的详细信息字段中使用的模式

      const NotebookDetails = new GraphQLObjectType({
          name: 'NotebookDetails',
          fields: () => ({
              id: { type: GraphQLID },
              description: { type: GraphQLString },
              language: { type: GraphQLString },
      
          }),
      
      });
      

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 2018-03-28
        • 2017-08-16
        • 2016-12-31
        • 2019-09-19
        • 2017-03-07
        • 2017-09-03
        • 2018-06-25
        • 2018-06-30
        相关资源
        最近更新 更多