2016-05-05 11 views
8

Sto mettendo un wrapper GraphQL su un'API REST esistente come descritto in Zero to GraphQL in 30 minutes. Ho un endpoint API per un prodotto con una proprietà che punta a un oggetto nidificato:GraphQL - Ottieni tutti i campi dall'oggetto JSON nidificato

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

E 'possibile definire lo schema in modo che possa ottenere questo intero oggetto nidificato senza definire in modo esplicito l'oggetto nidificato e tutte le sue proprietà? Voglio che la mia query per specificare solo che voglio l'oggetto nidificato, e non c'è bisogno di specificare tutte le proprietà che voglio dall'oggetto nidificato:

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

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

posso fare la seconda versione, ma richiede un sacco di codice aggiuntivo , compresa la creazione di NestedObjectType e la specifica di tutte le proprietà nidificate. Ho anche capito come ottenere automaticamente un elenco di tutte le chiavi, in questo modo:

const ProductType = new GraphQLObjectType({ 
    ... 

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

non ho trovato un modo per tornare automaticamente l'intero oggetto, però.

+1

AFAIK, fornire l'intero oggetto nidificato senza specificarne esplicitamente i campi non è possibile in GraphQL al momento. È in qualche modo contrario al principio di GraphQL, che mira a fornire solo i dati necessari/richiesti, invece di fornire tutti i dati contemporaneamente. Dovresti considerare seriamente la motivazione per l'utilizzo di GraphQL. Se ti preoccupi della larghezza di banda dei dati mobili, può essere una buona scelta. –

+0

Grazie per la risposta. Sto solo giocando con esso per scopi di apprendimento. Ho pensato che potrebbe essere il caso. Per me, ha senso per le query di livello superiore, ma non tanto per gli oggetti nidificati. Nel componente, voglio solo scorrere tutte le cose nell'oggetto nidificato - sembra che se qualcosa viene aggiunto a quell'oggetto sul server, il client non dovrebbe preoccuparsi di questo. Immagino che questo problema potrebbe essere più facilmente evitato se si utilizza GraphQL come API principale invece di eseguire il wrapping di una API REST esistente. – collinksmith

+0

"sembra che se qualcosa viene aggiunto a quell'oggetto sul server, il client non dovrebbe preoccuparsi di questo." Intendi notifica/aggiornamento basata su push (da server a client)? –

risposta

4

Posso eseguire la seconda versione, ma richiede molto codice aggiuntivo, compresa la creazione di un NestedObjectType e la specifica di tutte le proprietà nidificate.

Fallo! Sarà fantastico. Questa è la strada da percorrere per utilizzare GraphQL al massimo delle sue potenzialità.

Oltre a evitare il sovraccarico, offre anche molti altri vantaggi come la convalida del tipo e un codice più leggibile e gestibile poiché lo schema fornisce una descrizione più completa dei dati. Ti ringrazierai più tardi per aver fatto il lavoro extra in anticipo.

Se per qualche motivo davvero non si desidera seguire questa strada e comprendere appieno le conseguenze, è possibile codificare gli oggetti nidificati come stringhe utilizzando JSON.stringify.

Ma come ho detto, consiglio di non farlo!