Je veux définir une mutation en utilisant graphql.
Ma mutation obtient un objet comme argument. J'ai donc défini le nouvel objet dans le schéma et dans le résolveur à l'aide de GraphQLObjectType.
Cependant, je reçois cette erreur:
Erreur: Accord.nom défini dans les résolveurs, mais pas dans le schéma
Une idée ?
Voici ma définition de schéma
const typeDefs = `
type Agreement {
id: Int
}
type Mutation {
agreementsPost(agreement: Agreement) : String
}
`;
Et voici mon résolveur:
const appResolvers = {
Agreement: new GraphQLObjectType({
name: 'Agreement',
fields: {
id: { type: GraphQLInt },
}
}),
Mutation: {
agreementsPost(root, args) {
return axios.post("....").then(res => res.data);
},
}
Quelques choses à régler ici. Tout d'abord, pour utiliser un objet comme argument, vous devez le définir comme input
(ou GraphQLInputObjectType
) dans votre schéma - vous ne pouvez pas utiliser un type
(ou GraphQLObjectType
) comme argument.
Vos définitions de type doivent donc ressembler à ceci:
type Mutation {
agreementsPost(agreement: Agreement): String
}
input Agreement {
id: Int
}
Si vous avez déjà un type Agreement
, vous devrez nommer votre entrée autrement. C'est une bonne convention de simplement ajouter Input
au nom de votre type:
type Mutation {
agreementsPost(agreement: AgreementInput): String
}
type Agreement {
id: Int
}
input AgreementInput {
id: Int
}
Cela devrait être suffisant pour vous permettre de passer un objet AgreementInput
comme argument à votre mutation. Vous n'avez pas besoin d'ajouter Agreement
ou AgreementInput
à vos résolveurs (en fait, les entrées ne sont pas "résolues" par GraphQL, donc l'ajout d'un résolveur pour une entrée n'est pas possible).
Cela dit, votre objet résolveurs ne devrait pas avoir besoin d'incorporer l'un des constructeurs de type fournis par le package graphql
- Apollo construit un objet GraphQLSchema
à partir de vos résolveurs et définit les définitions pour vous lorsque vous appelez makeExecutableSchema
.
Si vos définitions de types incluent les types Foo
et Bar
, votre objet resolvers
pourrait ressembler à ceci:
const resolvers = {
Foo: {
someFooProperty: (foo, args, context, info) => {}
},
Bar: {
someBarProperty: (bar, args, context, info) => {}
someOtherBarProperty: (bar, args, context, info) => {}
},
Query: {
someQuery: (root, args, context, info) => {}
},
Mutation: {
someMutation: (root, args, context, info) => {}
},
}
Remarquez comment chaque propriété de l'objet resolvers
correspond à l'un des types définis dans votre schéma (y compris Query et Mutation). La valeur de chacune de ces propriétés est elle-même un objet, chaque propriété mappant sur l'un des champs définis pour ce type particulier. La valeur de chaque champ est votre fonction resolve
.
La raison de l'erreur que vous voyez est que vous avez effectivement dit à makeExecutableSchema
d'ajouter des résolveurs à deux champs sur le type d'accord - name
et fields
- ni dont sont réellement dans votre schéma selon vos définitions de type.
Vous pouvez en savoir plus sur la façon de générer un schéma à l'aide d'Apollo ici . Vous pouvez voir des exemples de génération "par programme" d'un schéma en utilisant uniquement GraphQL.js en définissant un objet GraphQLSchema et en le transmettant à votre middleware à la place. Les deux approches présentent des avantages et des inconvénients, mais l'utilisation de makeExecutableSchema
est généralement plus facile et moins sujette aux erreurs. Quoi qu'il en soit, il est bon de savoir comment générer un schéma par programme, mais vous ne devez pas mélanger les deux!
Dans mon cas, cela se produit car il y a incohérent dans le schéma pour non-null. dans ma mutation, je n'ai pas la mutation non nulle tandis que dans le schéma objet, il y a une mutation non nulle.
Je suis tombé sur cette erreur lors de la migration de la v1 d'apollo-server-express vers la v2, l'erreur était due au fait que les chargements n'étaient pas définis dans le schéma. Maintenant, lorsque vous déclarez votre schéma graphql, vous pouvez utiliser l'option set uploads: false
// GraphQL: Schema
const SERVER = new ApolloServer({
typeDefs: typeDefs,
resolvers: resolvers,
introspection: true,
uploads: false,
playground: {
endpoint: `http://localhost:3000/graphql`,
settings: {
'editor.theme': 'light'
}
}
});
Semble résoudre le problème dans ce cas si votre erreur est spécifique à Uploads