2015-11-20 11 views
10

Sto guardando graphql. È possibile definire un oggetto con attributi arbitrari? Diciamo che ho alcuni dati come:Oggetti dinamici (univoci) in GraphQl

editOptions : { boxes : 3 , size : { width: 23,height:32} , color: #434343 }, etc...} 

e questo è in:

{ ... , box : { editOptions : {...} }, ... } 

Diciamo che editOptions non è mai con la stessa struttura, a volte non essere utile avere il colore, solo per esempio amor. In mangusta si può solo definire il tipo a qualcosa di simile:

editOptions: {}

Questi editOptions sono di solito unico per ogni casella. Con alcuni attributi condivisi ma la maggior parte dei quali sono unici.

Quindi la mia domanda è, c'è un modo per farlo? o è questa cattiva pratica e dovrei cambiare i miei modelli.

Grazie.

risposta

3

Hai due opzioni.

1. Interfaccia

Se il editOptions può variare in base al tipo, ma sono coerenti per quel particolare tipo, è possibile utilizzare un Interface (node.js example).

Diciamo che hai due oggetti, una scatola e una sfera. È possibile definire un'interfaccia oggetto che sia attuare:

interface Object 
type Box implements Object { 
    editOptions: BoxOptions 
} 
type BoxOptions { 
    boxes: Int, 
    size: ..., 
    color: ... 
} 
type Sphere implements Object { 
    editOptions: SphereOptions 
} 
type SphereOptions { 
    spheres: Int, 
    ... 
} 
type Query { 
    objects: [Object] 
} 

Nel tua ricerca, si sarebbe quindi restituire un Object, e le opzioni richieste basate per ogni tipo:

query Query { 
    objects(filter: "...") { 
    ... on Box { 
     editOptions { 
     boxes 
     size 
     } 
    } 
    ... on Sphere { 
     editOptions { 
     spheres 
     } 
    } 
    } 
} 

Nel JSON restituito, le caselle avranno i campi boxes e size in editOptions e le sfere avranno spheres.

a volte non essere utile avere il colore

Se per alcune delle caselle non avete il colore, il campo sarebbe semplicemente essere vuoto (ma esistono ancora nello schema).

2. JSON

Se il editOptions può essere davvero variabile, si può semplicemente definire il campo come stringa, e inviare più di JSON serializzato. Perderai tutte le convalide del tipo ma la struttura può essere totalmente arbitraria per ogni oggetto. Assicurati che il tuo cliente capisca cosa fare con esso.

+0

Ehi, mi spiace per il ritardo di risposta, che è una buona soluzione davvero grazie. Il problema è che non ci saranno solo scatole, sfere, cubi, ecc. Dobbiamo lasciarlo aperto a infinite possibilità =) ma questa è sicuramente una possibilità. grazie! –

7

Usa GraphQLScalarType, semplicemente implementare le cose come:

import { GraphQLScalarType } from 'graphql/type'; 
import { GraphQLError } from 'graphql/error'; 
import { Kind } from 'graphql/language'; 

const ObjectType = new GraphQLScalarType({ 
    name: 'ObjectType', 
    serialize: value => value, 
    parseValue: value => value, 
    parseLiteral: (ast) => { 
    if (ast.kind !== Kind.OBJECT) { 
     throw new GraphQLError(
     `Query error: Can only parse object but got a: ${ast.kind}`, 
     [ast], 
    ); 
    } 
    return ast.value; 
    }, 
}); 

const ReturnType = new GraphQLObjectType({ 
    name: 'ReturnType', 
    fields: { 
    // ... 
    editOptions: { type: ObjectType }, 
    // ... 
    }, 
}); 
+0

Sto provando a usare questo, ma ottengo questo messaggio: '" messaggio ":" Argument \ "data \" ha valore non valido {a: \ "A \", b: \ "B \"}. \ NIn attesa digita \ "ObjectType \", trovato {a: \ "A \", b: \ "B \"}. "'. Qualche idea dove è il problema? –

+1

Sembra che ora puoi trovare questo come un modulo pubblico su https://www.npmjs.com/package/graphql-type-json. – jiku

Problemi correlati