Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GraphQL Error field type must be Input Type but got:

Here is the mutation:

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

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

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

    },
});

Here is the schema used in the details field of the mutation:

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

    }),

});

Error I am getting on running this code is :

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)

I have used this syntax with queries and they worked correctly. But, they are returning error with a mutation. What is incorrect in my code and how do I correct it?

like image 959
lee huang Avatar asked Aug 21 '17 22:08

lee huang


4 Answers

In GraphQL, an input cannot be used as a type and a type cannot be used as an input. Unfortunately, even if the fields appear identical to an existing type, you always have to define a separate input to use as an argument. Try something like this:

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

If using SDL, the same type would look like this:

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

Please see this answer for an extensive explanation of why it's necessary to do this.

like image 200
Daniel Rearden Avatar answered Sep 20 '22 17:09

Daniel Rearden


For those who are using graphql-tools and stumble accross this post, documentation is here at GraphQL's Website.

My Example using graphQL tools is here below: (this has an input inside of an input AKA an ImageInput inside the SocialPostInput)

//mutation file

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

//Schedule and SocialPost file

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 }` 
like image 20
Kevin Danikowski Avatar answered Sep 18 '22 17:09

Kevin Danikowski


If you describe schema within schema.graphql file, just replace type to input:

Wrong:

type SomeData {
  someField: String!
}

Right:

input SomeData {
  someField: String!
}
like image 25
zemil Avatar answered Sep 21 '22 17:09

zemil


Please change type CreateNotebookInput to input CreateNotebookInput

like image 41
Phuc Trinh Avatar answered Sep 20 '22 17:09

Phuc Trinh