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