El tipo de campo de error de GraphQL debe ser tipo de entrada pero obtuvo:

3 minutos de lectura

avatar de usuario de lee huang
lee huang

Aquí está la mutación:

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

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

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

    },
});

Este es el esquema utilizado en el campo de detalles de la mutación:

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

    }),

});

El error que recibo al ejecutar este código es:

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)

He usado esta sintaxis con consultas y funcionaron correctamente. Pero, están devolviendo un error con una mutación. ¿Qué es incorrecto en mi código y cómo lo corrijo?

Avatar de usuario de Daniel Rearden
daniel rearden

En GraphQL, un input no se puede utilizar como type y un type no se puede utilizar como un input. Desafortunadamente, incluso si los campos parecen idénticos a un tipo existente, siempre debe definir una entrada separada para usarla como argumento. Prueba algo como esto:

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

Si usa SDL, el mismo tipo se vería así:

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

Consulte esta respuesta para obtener una explicación detallada de por qué es necesario hacer esto.

  • Esto me llevó mucho tiempo entenderlo, ¡pero parece bastante “obvio” una vez que lo entiendes!

    – Kendall

    19/10/2017 a las 19:00

  • su respuesta debería estar parpadeando en la parte superior de su sitio web

    – mccc

    21 de febrero de 2022 a las 15:13

Para aquellos que están usando graphql-tools y tropezar con esta publicación, la documentación es aquí en el sitio web de GraphQL.

Mi ejemplo usando herramientas graphQL es aquí debajo: (esto tiene una entrada dentro de una entrada AKA una ImageInput dentro de SocialPostInput)

//archivo de mutación

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

//Horario y archivo 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
}`

Si describe el esquema dentro del archivo schema.graphql, simplemente reemplace el tipo para ingresar:

Equivocado:

type SomeData {
  someField: String!
}

Derecho:

input SomeData {
  someField: String!
}

  • Sigo tu respuesta @zemil, y me funciona. Gracias. Mi pregunta es: tengo un lenguaje de esquema grande y tengo que clonar el tipo para convertirlo en una entrada. ¿Hay opciones existentes que minimicen la redundancia porque su única diferencia es el tipo/código de entrada, los campos son todos iguales?

    – Jur P

    23 de diciembre de 2021 a las 7:32

  • @JurP revisa stackoverflow.com/questions/52452982/…

    – trabajo.js.org

    23 de diciembre de 2021 a las 9:17


Por favor cambia type CreateNotebookInput a input CreateNotebookInput

Aquí está el esquema utilizado en el campo de detalles de la mutación.

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

    }),

});

¿Ha sido útil esta solución?