GraphQL : der name des Objekts ist definiert Resolver, aber nicht in der schema –

Möchte ich definieren, dass eine mutation mit graphql.

Meine mutation ist immer ein Objekt als argument. So definierte ich das neue Objekt in der schema-und der resolver mit GraphQLObjectType.

Aber ich m immer diese Fehlermeldung :

Fehler: Vereinbarung.definierte name Resolver, aber nicht in der schema –

Irgendeine Idee ?

Hier ist mein Schema definition

const typeDefs = `

    type Agreement {
        id: Int
    }

    type Mutation {
        agreementsPost(agreement: Agreement) : String
    }
`;

Und Hier ist mein resolver :

const appResolvers = {

    Agreement: new GraphQLObjectType({
        name: 'Agreement',
        fields: {
            id: { type: GraphQLInt },
        }
    }),
Mutation: {

       agreementsPost(root, args) {
            return axios.post("....").then(res => res.data);
        },
    }
InformationsquelleAutor taboubim | 2018-04-23



3 Replies
  1. 7

    Paar Dinge zu fix hier. Erstens, verwenden Sie ein Objekt als argument übergeben, müssen Sie definieren es als eine input (oder GraphQLInputObjectType) in Ihrem schema-man kann nicht mit einem regulären type (oder GraphQLObjectType) als argument.

    So Ihr Typ-Definitionen müssen wie folgt Aussehen:

    type Mutation {
      agreementsPost(agreement: Agreement): String
    }
    
    input Agreement {
      id: Int
    }
    

    Wenn Sie bereits ein Agreement geben, müssen Sie einen Namen für euren input etwas anderes. Es ist eine gute Konvention, um nur anfügen Input zu was auch immer Ihre Art name:

    type Mutation {
      agreementsPost(agreement: AgreementInput): String
    }
    
    type Agreement {
      id: Int
    }
    
    input AgreementInput {
      id: Int
    }
    

    Diese sollte ausreichend sein, um Ihnen zu erlauben, zu passieren, in einem AgreementInput – Objekt als argument, um Ihre mutation. Sie nicht brauchen, um hinzuzufügen Agreement oder AgreementInput zu Ihrem Resolver (in der Tat, die Eingänge werden nicht „gelöst“, indem GraphQL, so das hinzufügen eines resolver für eine Eingabe ist nicht möglich).

    Sagte, Ihre Resolver-Objekt, sollten Sie nicht brauchen, um beliebige der Typ-Konstruktoren zur Verfügung gestellt von der graphql Paket — Apollo-Konstrukte eine GraphQLSchema Objekt aus Ihrer Resolver-und Typ-Definitionen für Sie, wenn Sie anrufen makeExecutableSchema.

    Wenn Ihr Typ-Definitionen umfassen die Arten Foo und Bar Ihre resolvers Objekt könnte wie folgt Aussehen:

    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) => {}
      },
    }
    

    Beachten Sie, wie jede Eigenschaft in der resolvers Objekt mit einem der Typen im schema definiert (einschließlich Abfrage und Mutation). Der Wert jeder dieser Eigenschaften ist selbst ein Objekt, mit jeder Eigenschaft, die Zuordnung zu einem der definierten Felder, die für diesen bestimmten Typ. Jedes Feld ist der Wert Ihrer resolve Funktion.

    Den Grund für die Fehler, die Sie sehen, ist, dass Sie haben effektiv gesagt makeExecutableSchema hinzufügen Resolver-zwei Felder, die auf der Zustimmung geben — name und fields – weder von denen sind eigentlich in Ihrem schema entsprechend Ihren Typ-Definitionen.

    Lesen Sie mehr über das generieren eines Schemas mit Apollo hier. Möglicherweise sehen Sie Beispiele für die Generierung eines Schemas „programmatisch“ – mit nur GraphQL.js durch die Definition einer GraphQLSchema-Objekt und übergeben, die mit der middleware statt. Es gibt vor-und Nachteile beider Ansätze, aber mit makeExecutableSchema ist in der Regel einfacher und weniger fehleranfällig. So oder so, es ist gut zu wissen, wie man ein schema generiert ein Programm, aber Sie sollten nicht mischen Sie die beiden!

    • Ausgezeichnet! es funktioniert, vielen Dank für deine perfekte Antwort
  2. 1

    In meinem Fall es geschieht, weil es inkonsistent im schema für die nicht-null –. in meiner mutation habe ich nicht die nicht-null-mutation, während in der Objekt-schema, es hat nicht-null-mutation.

  3. 0

    Stieß ich auf diesen Fehler bei der Migration von v1 apollo-server-express-v2, der Fehler hatte zu tun mit den Uploads nicht im schema definiert. Nun, wenn man erklärt, dass man graphql schema können Sie mithilfe der 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'
        }
      }
    });
    

    Scheint die Frage zu lösen, in diesem Fall, wenn Sie Ihre Fehler Uploads bestimmten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.