2017-02-20 4 views
0

Hier ist mein Code aus dem ausdrücklichen Antrag für GraphQL Schema: -In GraphQL-Schema, wie kann ein Feld GraphQLString sowie GraphQLInt sein?

let data = new GraphQLObjectType({ 
    name:"Data", 
    fields: { 
     id: {type: GraphQLID}, 
     value: {type: GraphQLString} // TODO: allow for string as well as int 
    } 
}); 

Wie kann ich ‚Wert‘ Feld akzeptiert einen String-Wert sowie int-Wert, so dass es mit der richtigen Art gespeichert werden kann?

+0

okay, wenn Sie den Wert 'integer' sowie' string' dann gemacht haben, welchen Typ würden Sie für die Datenbank in Betracht ziehen? –

+0

@ p0k8_ Der Zweck von GraphQL ist das Verstecken von Datenbankdetails. Es spielt keine Rolle, ob dieser Wert aus der Datenbank A oder B oder einer Datei oder einer anderen API stammt. Es ist also durchaus zulässig, Unionstypen zu haben –

+0

graphql liefert 'int', aber das Datenbankschema für den Typ ist' string' then ?? –

Antwort

0

EDIT: Diese Lösung ist nicht gültig für die Frage. Es funktioniert nur für Objekttypen und Skalare nicht

Sie bei GraphQLUnionType aussehen sollen: http://graphql.org/graphql-js/type/#graphqluniontype

Ich bin es gewöhnt, nicht Typen wie diese zu definieren, aber ich erwarte, dass es so etwas wie die folgenden sein:

var ValueType = new GraphQLUnionType({ 
    name: 'Value', 
    types: [ GraphQLString, GraphQLInt ], 
    resolveType(value) { 
    if (value instanceof string) { 
     return GraphQLString; 
    } 
    if (value instanceof number) { 
     return GraphQLInt; 
    } 
    } 
}); 

let data = new GraphQLObjectType({ 
    name:"Data", 
    fields: { 
     id: {type: GraphQLID}, 
     value: {type: ValueType} 
    } 
}); 
+0

'UnionType' kann nur Objekttypen haben, es kann keinen Typ wie' String' oder 'Int' enthalten. –

+0

Mein Fehler. Ich habe den nicht-skalaren Teil davon vermisst. Ich sehe dieses Problem in Bezug auf den Anwendungsfall: https://github.com/facebook/graphql/issues/215 –

+0

Ich denke, es ist irreführend für diese Antwort eine upvote erhalten, da es für diesen Fall nicht funktioniert. Ich fordere, dass es wieder auf 0 gesetzt wird. Ich habe noch nicht genug Reputation, um diese Änderung vorzunehmen. –

1

Laut Ihrem Kommentar, dass Sie NoSQL-Datenbank verwenden, die sowohl Zeichenfolgen als auch Ints im selben Feld platzieren können, sollten Sie mit GraphQLString gehen. Wenn Sie eine neue Instanz des oben genannten Objekts erstellen, können Sie eine resolve-Methode für das Feld value erstellen, die überprüft, ob der übergebene Wert string oder int ist (natürlich wäre es immer eine Zeichenkette wegen GraphQLString Typ, es kann jedoch eine Zeichenkette wie "123" sein kann zu int) geparst werden - entsprechend können Sie vor dem Speichern in der Datenbank ein Parsing durchführen. Auf der anderen Seite, wenn Sie die Daten aus der Datenbank abrufen, wird es immer als string in der graphql Darstellung auftreten - wenn dies kein Fall ist, denke ich, dass dies eine einfache Lösung sein könnte.

Wenn Sie jedoch mit diesem Vorschlag nicht zufrieden sind, habe ich Angst, dass Sie GraphQL nicht wie gewünscht austricksen können. Jedes Feld kann nur eine einzige Typdefinition erhalten.

Verwandte Themen