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