Graphqlを使用して突然変異を定義したい。
私の突然変異は、引数としてオブジェクトを取得しています。そこで、GraphQLObjectTypeを使用して、スキーマとリゾルバで新しいオブジェクトを定義しました。
しかし、私はこのエラーを受け取っています:
エラー:Agreement.nameはリゾルバで定義されていますが、スキーマでは定義されていません
何か案が ?
ここに私のスキーマ定義があります
const typeDefs = `
type Agreement {
id: Int
}
type Mutation {
agreementsPost(agreement: Agreement) : String
}
`;
そして、ここに私のリゾルバがあります:
const appResolvers = {
Agreement: new GraphQLObjectType({
name: 'Agreement',
fields: {
id: { type: GraphQLInt },
}
}),
Mutation: {
agreementsPost(root, args) {
return axios.post("....").then(res => res.data);
},
}
ここで修正することがいくつかあります。まず、オブジェクトを引数として使用するには、スキーマ内でinput
(またはGraphQLInputObjectType
)として定義する必要があります-通常のtype
(またはGraphQLObjectType
)を引数として使用することはできません。
したがって、型定義は次のようにする必要があります。
type Mutation {
agreementsPost(agreement: Agreement): String
}
input Agreement {
id: Int
}
Agreement
型が既にある場合は、入力に別の名前を付ける必要があります。タイプ名にInput
を追加するのが良い慣習です:
type Mutation {
agreementsPost(agreement: AgreementInput): String
}
type Agreement {
id: Int
}
input AgreementInput {
id: Int
}
これは、AgreementInput
オブジェクトを突然変異の引数として渡すのに十分なはずです。 Agreement
やAgreementInput
をリゾルバーに追加する必要はありません(実際、GraphQLによって入力は「解決」されないため、入力にリゾルバーを追加することはできません)。
ただし、リゾルバーオブジェクトには、graphql
パッケージで提供される型コンストラクターを組み込む必要はありません-Apolloは、GraphQLSchema
を呼び出すときに、リゾルバーと型定義からmakeExecutableSchema
オブジェクトを作成します。
タイプ定義にFoo
およびBar
タイプが含まれる場合、resolvers
オブジェクトは次のようになります。
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) => {}
},
}
resolvers
オブジェクトの各プロパティが、スキーマで定義されたタイプの1つ(クエリおよび突然変異を含む)とどのように一致するかに注意してください。これらの各プロパティの値自体がオブジェクトであり、各プロパティはその特定のタイプに対して定義されたフィールドの1つにマッピングされます。各フィールドの値はresolve
関数です。
表示されるエラーの理由は、makeExecutableSchema
に契約タイプの2つのフィールド(name
およびfields
)にリゾルバーを追加するように効果的に指示したためです。
Apollo here を使用してスキーマを生成する方法について詳しく読むことができます。 GraphQLSchemaオブジェクトを定義し、代わりにミドルウェアに渡すことで、GraphQL.jsだけを使用して「プログラムで」スキーマを生成する例を見ることができます。両方のアプローチには長所と短所がありますが、一般的にmakeExecutableSchema
を使用する方が簡単で、エラーが発生しにくくなります。いずれにせよ、スキーマをプログラムで生成する方法を知っておくのは良いことですが、この2つを混在させないでください!
私の場合、null以外のスキーマで一貫性がないがあるために発生します。私の突然変異では、非ヌル突然変異はありませんが、オブジェクトスキーマでは、非ヌル突然変異があります。
Apollo-server-expressのv1からv2に移行するときにこのエラーに出くわしました。このエラーは、スキーマで定義されていないアップロードに関係していました。これで、graphqlスキーマを宣言するときに、オプションセット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'
}
}
});
エラーがUploads
固有の場合、この場合の問題を解決するように見えます