2016-05-05 21 views
8

Ich setze einen GraphQL-Wrapper über eine bestehende REST-API, wie in Zero to GraphQL in 30 minutes beschrieben. Ich habe einen API-Endpunkt für ein Produkt mit einer Eigenschaft bekomme, das auf ein verschachteltes Objekt zeigt:GraphQL - Alle Felder aus verschachtelten JSON-Objekten abrufen

// API Response 
{ 
    entity_id: 1, 
    nested_object: { 
    key1: val1, 
    key2: val2, 
    ... 
    } 
} 

Ist es möglich, das Schema zu definieren, so dass ich dieses ganzes verschachtelte Objekt bekommen kann, ohne explizit das verschachtelte Objekt zu definieren und alle seine Eigenschaften? Ich mag meine Abfrage nur angeben, dass ich das verschachtelte Objekt werden soll, und nicht braucht, um alle Eigenschaften angeben ich aus dem verschachtelten Objekt will:

// What I want 
{ 
    product(id: "1") { 
    entityId 
    nestedObject 
    } 
} 

// What I don't want 
{ 
    product(id: "1") { 
    entityId 
    nestedObject { 
     key1 
     key2 
     ... 
    } 
    } 
} 

ich die zweite Version tun, aber es erfordert eine Menge zusätzlichen Code einschließlich der Erstellung eines NestedObjectType und Angabe aller verschachtelten Eigenschaften. Ich habe auch, wie automatisch herausgefunden, um eine Liste aller Schlüssel, etwa so:

const ProductType = new GraphQLObjectType({ 
    ... 

    fields:() => ({ 
    nestedObject: { 
     type: new GraphQLList(GraphQLString), 
     resolve: product => Object.keys(product.nested_object) 
    } 
    }) 
}) 

Ich habe nicht einen Weg gefunden, um automatisch das gesamte Objekt zurück, though.

+1

AFAIK, das das gesamte verschachtelte Objekt zur Verfügung stellt, ohne seine Felder explizit anzugeben, ist in GraphQL derzeit nicht möglich. Das widerspricht dem Prinzip von GraphQL, das darauf abzielt, nur die benötigten/angeforderten Daten zu liefern, anstatt alle Daten auf einmal bereitzustellen. Sie sollten ernsthaft über die Motivation für die Verwendung von GraphQL nachdenken. Wenn Sie sich mit der mobilen Datenbandbreite befassen, kann dies eine gute Wahl sein. –

+0

Danke für die Antwort. Ich spiele damit nur zu Lernzwecken. Ich dachte, das könnte der Fall sein. Für mich ist es sinnvoll für die Abfragen auf höchster Ebene, aber nicht so sehr für verschachtelte Objekte. In der Komponente möchte ich einfach alles im verschachtelten Objekt durchlaufen - es scheint, als ob etwas zu dem Objekt auf dem Server hinzugefügt wird, der Client sollte sich nicht darum kümmern müssen. Ich denke, dass dieses Problem leichter vermieden werden könnte, wenn Sie GraphQL als Haupt-API verwenden, anstatt eine vorhandene REST-API zu verpacken. – collinksmith

+0

"Es scheint, als ob etwas zu diesem Objekt auf dem Server hinzugefügt wird, der Client sollte sich nicht darum kümmern müssen." Meinst du Push-basierte Benachrichtigung/Update (von Server zu Client)? –

Antwort

4

Ich kann die zweite Version, aber es erfordert viel zusätzlichen Code, einschließlich Erstellen eines NestedObjectType und Angabe aller verschachtelten Eigenschaften.

Tun Sie es! Es wird toll sein. Das ist der richtige Weg, um GraphQL voll auszuschöpfen.

Abgesehen davon, dass Sie das Überholen verhindern, bietet es Ihnen auch viele andere Vorteile wie die Typprüfung und besser lesbaren und wartbaren Code, da Ihr Schema eine umfassendere Beschreibung Ihrer Daten liefert. Du wirst dir später dafür danken, dass du die zusätzliche Arbeit im Voraus gemacht hast.

Wenn Sie aus irgendeinem Grund diesen Weg nicht wirklich gehen und die Konsequenzen vollständig verstehen möchten, könnten Sie die verschachtelten Objekte als Zeichenfolgen unter Verwendung von JSON.stringify codieren.

Aber wie ich schon sagte, ich empfehle Ihnen nicht!

Verwandte Themen