2017-09-13 4 views
1

Ziel meiner App ist es, dass Benutzer eine Liste von Formularen speichern und abrufen können, die ausgefüllt und bearbeitet werden sollen. Ein Benutzer wird viele Formen haben, und ein einzelnes Formular wird aus mehreren eigenen Feldern bestehen.Übergeben einer Liste benutzerdefinierter Typen an eine GraphQL-Mutation

Wenn mein haben meine Typen wie diese aufgebaut, zum Beispiel:

const FormType = new GraphQLObjectType({ 
    name: 'FormType', 
    fields: { 
    id: { type: GraphQLID }, 
    name: { type: GraphQLString }, 
    email: { type: GraphQLString } 
    } 
}); 
const UserType = new GraphQLObjectType({ 
    name: 'UserType', 
    fields: { 
    id: { type: GraphQLID }, 
    email: { type: GraphQLString }, 
    firstName: { type: GraphQLString, default: '' }, 
    lastName: { type: GraphQLString, default: '' }, 
    phone: { type: GraphQLString, default: '' }, 
    forms: { type: new GraphQLList(FormType) } 
    } 
}); 

Und meine Mutation wie folgt aus:

const mutation = new GraphQLObjectType({ 
    name: 'Mutation', 
    fields: { 
    saveForm: { 
     type: UserType, 
     args: { 
     userID: { type: GraphQLID }, 
     form: { type: FormType } // ??? 
     }, 
     resolve(parentValue, { userID, form }) { 
     // I'll figure out what to do here when the time comes 
     } 
    } 
    } 
}); 

Ich kann nicht eine Mutation zu schaffen scheinen, die mit GraphQLList funktioniert . Ich erhalte diese Fehlermeldung:

Error: Mutation.saveForm(form:) argument type must be Input Type but got: FormType.

..., die meine Forschung sagt mir bedeutet, dass FormType ein GraphQLInputObjectType sein muss. Wenn ich es entsprechend ändere, bekomme ich nur den Fehler:

Error: Mutation.saveForm(form:) argument type must be Output Type but got: FormType.

So nichts ändert sich wirklich. Kennt jemand ein funktionierendes Beispiel für dieses Problem?

Antwort

0

Das Problem, das Sie sehen, ist, weil, während Sie richtig haben Ihre Eingabetyp ein GraphQLInputObjectType geändert zu werden, dass die Art des Feldes zu UserType.forms an einen Eingangstyp ändert - erinnern UserType eine Ausgabetyp ist. Hier müssten Sie einen FormType und auch einen FormInputType machen und jeden an der entsprechenden Stelle verwenden.

Separat: warum benötigen Sie einen vollständigen Eingabetyp für ein Formular? Funktioniert es nicht genauso gut, die ID einfach zu übergeben? Oder, wenn die Absicht besteht, FormType Formulardaten darzustellen, warum benötigt es eine ID? Vielleicht könnte es auch besser FormData genannt werden?

Schließlich, während ich glaube, dass dies eine Antwort bietet, lieferte Ihre Frage nicht vollständig Schnitt + pasteable Code für eine minimale, vollständige und überprüfbare Beispiel, so dass ich leicht überprüfen konnte.

+0

Also anstatt zu versuchen, eine Liste von FormTypes-Objekten zu übergeben, sollte ich nur eine Liste ihrer IDs übergeben? Das macht sehr viel Sinn, das würde die GraphQList nicht stören, nehme ich an. Das ursprüngliche Denken über den Eingabetyp für ein Formular ist, weil das Formular selbst sehr komplex ist, und ich möchte es aus mehreren kleineren Typen erstellen, ähnlich wie meine React-Komponenten strukturiert sind. Ich dachte mir, sobald ich weiß, wie man den Formulartyp an den Benutzer weitergibt, könnte ich die gleiche Logik auf die Formulartypen anwenden. – JayBauer

+0

Ich denke, ich vermisse etwas hier. Benötige ich keine separate Mutation, um das Formular zu speichern (wodurch die ID generiert wird), bevor ich es an den Benutzer übergeben kann? Ich weiß, dass ich wahrscheinlich etwas vermisse, aber ich mache seit ein paar Tagen keinen Fortschritt mehr und es fängt an, mich an die Wand zu fahren. Ich entschuldige mich, wenn irgendetwas, was ich an dieser Stelle sage, offensichtlich erscheint. Alles, was ich weiter klären kann, um dies leichter verständlich zu machen, werde ich zur Verfügung stellen. – JayBauer

+0

Kein Grund sich zu entschuldigen! Das ist immer noch ziemlich modern. Habe ich Recht, dass der ursprüngliche Titel "Eine Liste von benutzerdefinierten Typen übergeben" nicht ganz richtig ist? Und das müssen Sie tatsächlich in einem Satz (oder in GraphQL-Begriffen, Objekt) von Formulardaten übergeben? Es scheint mir, dass "Form" hier nicht wirklich das Wesentliche ist, aber vielleicht eine Liste von Fragen? –

Verwandte Themen