Javascript GraphQL错误字段类型必须为输入类型,但已获取:

Javascript GraphQL错误字段类型必须为输入类型,但已获取:,javascript,graphql,Javascript,Graphql,以下是突变: const createNotebook = mutationWithClientMutationId ({ name: 'CreateNotebook', inputFields: { token: { type: GraphQLString, }, details: { type: NotebookDetails, }, }, out

以下是突变:

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)
api_1|错误:CreateNotebookInput.details字段类型必须为输入类型,但Get: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(本机)
api|1|位于GraphQLInputObjectType._defineFieldMap(/usr/src/app/node|modules/graphql/type/definition.js:693:16)
api_1|位于graphqlinputObject.getFields(/usr/src/app/node_modules/graphql/type/definition.js:682:49)
api_1|位于typeMapReducer(/usr/src/app/node_modules/graphql/type/schema.js:224:26)
api_1|位于typeMapReducer(/usr/src/app/node_modules/graphql/type/schema.js:190:12)
api_1| at Array.reduce(本机)
api_1| at/usr/src/app/node_modules/graphql/type/schema.js:217:36
api_1| at Array.forEach(本机)
api_1|位于typeMapReducer(/usr/src/app/node_modules/graphql/type/schema.js:210:27)
api_1| at Array.reduce(本机)
api_1|位于新的GraphQLSchema(/usr/src/app/node_modules/graphql/type/schema.js:98:34)
api|1|at对象。(/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)
我在查询中使用了这种语法,它们工作正常。但是,他们返回的是带有突变的错误。
我的代码中有什么不正确以及如何更正?

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

const NotebookDetailsInput = new GraphQLInputObjectType({
  name: 'NotebookDetailsInput',
  fields: () => ({
    id:          { type: GraphQLID },
    description: { type: GraphQLString },
    language:    { type: GraphQLString }, 
  })
});
input {
  id: ID
  description: String
  language: String
}
如果使用SDL,相同的类型将如下所示:

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

有关为什么需要这样做的详细说明,请参见。

对于使用
graphql工具的人和StumbleAccross这篇文章,文档位于graphql的网站上。

我使用graphQL工具的示例如下所示
SocialPostInput
中有一个输入,即
ImageInput

//变异文件

extend type Mutation {
    SchedulePost ( 
        socialPost: SocialPostInput,
        schedule: ScheduleInput
     ): ScheduledPost
}`
//计划和社会成本文件

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
}`

这花了我太长的时间去理解,但一旦你理解了,这看起来很“明显”!