web-dev-qa-db-ja.com

GraphQL:オブジェクト名はリゾルバで定義されていますが、スキーマでは定義されていません

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

ここで修正することがいくつかあります。まず、オブジェクトを引数として使用するには、スキーマ内で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オブジェクトを突然変異の引数として渡すのに十分なはずです。 AgreementAgreementInputをリ​​ゾルバーに追加する必要はありません(実際、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つを混在させないでください!

7
Daniel Rearden

私の場合、null以外のスキーマで一貫性がないがあるために発生します。私の突然変異では、非ヌル突然変異はありませんが、オブジェクトスキーマでは、非ヌル突然変異があります。

1
surga

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固有の場合、この場合の問題を解決するように見えます

0
mibbit