web-dev-qa-db-fra.com

Le type de champ d'erreur GraphQL doit être Type d'entrée mais a obtenu:

Voici la mutation:

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

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

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

    },
});

Voici le schéma utilisé dans le champ des détails de la 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;
            },
        },

    }),

});

L'erreur que j'obtiens en exécutant ce code est:

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)

J'ai utilisé cette syntaxe avec des requêtes et elles ont fonctionné correctement. Mais, ils renvoient une erreur avec une mutation. Qu'est-ce qui est incorrect dans mon code et comment le corriger?

25
lee huang

Dans GraphQL, un input ne peut pas être utilisé comme type et un type ne peut pas être utilisé comme input. Malheureusement, même si les champs semblent identiques à un type existant, vous devez toujours définir une entrée distincte à utiliser comme argument. Essayez quelque chose comme ceci:

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

Si vous utilisez SDL, le même type ressemblerait à ceci:

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

Veuillez voir cette réponse pour une explication détaillée de pourquoi il est nécessaire de le faire.

34
Daniel Rearden

Pour ceux qui utilisent graphql-tools et tombez sur cet article, la documentation est ici sur le site Web de GraphQL.

Mon exemple utilisant des outils graphQL est ici ci-dessous : (ceci a une entrée à l'intérieur d'un AKA d'entrée un ImageInput à l'intérieur du SocialPostInput)

// fichier de mutation

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

// Fichier Schedule et 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
}`
19
Kevin Danikowski