2016-04-16 12 views
6

Quando si definisce una query in uno schema, come faccio a fare riferimento a un valore di GraphQLEnumType dichiarato in precedenza, per utilizzarlo come valore predefinito di un argomento?Come utilizzare i nomi in un oggetto GraphQLEnumType come valore predefinito di un argomento di query GraphQL?

Diciamo che ho definito seguente ObservationPeriod GraphQLEnumType:

observationPeriodEnum = new GraphQLEnumType { 
    name: "ObservationPeriod" 
    description: "One of the performance metrics observation periods" 
    values: 
    Daily: 
     value: '1D' 
     description: "Daily" 
    […] 
} 

e usarlo come il tipo di query argomento period:

queryRootType = new GraphQLObjectType { 
    name: "QueryRoot" 
    description: "Query entry points to the DWH." 
    fields: 
    performance: 
     type: performanceType 
     description: "Given a portfolio EID, an observation period (defaults to YTD) 
        and as-of date, as well as the source performance engine, 
        return the matching performance metrics." 
     args: 
     period: 
      type: observationPeriodEnum 
      defaultValue: observationPeriodEnum.Daily ← how to achieve this? 
     […] 
} 

Attualmente sto usando il valore effettivo '1D' stringa come il valore predefinito; questo funziona:

 period: 
      type: observationPeriodEnum 
      defaultValue: '1D' 

Ma c'è un modo ho potuto utilizzare il nome simbolico Daily invece? Non sono riuscito a trovare un modo per utilizzare i nomi all'interno dello schema stesso. C'è qualcosa che ho trascurato?

sto chiedendo, perché mi aspettavo un tipo enum a comportarsi come un insieme di costanti anche, e per essere in grado di usarli in questo modo nella definizione dello schema:

 period: 
      type: observationPeriodEnum 
      defaultValue: observationPeriodEnum.Daily 

Naïve soluzione:

## 
# Given a GraphQLEnumType instance, this macro function injects the names 
# of its enum values as keys the instance itself and returns the modified 
# GraphQLEnumType instance. 
# 
modifiedWithNameKeys = (enumType) -> 
    for ev in enumType.getValues() 
    unless enumType[ ev.name]? 
     enumType[ ev.name] = ev.value 
    else 
     console.warn "SCHEMA> Enum name #{ev.name} conflicts with key of same 
     name on GraphQLEnumType object; it won't be injected for value lookup" 
    enumType 

observationPeriodEnum = modifiedWithNameKeys new GraphQLEnumType { 
    name: "description: "Daily"" 
    values: 
    […] 

che permette di utilizzarlo come desiderato nella definizione di schema:

 period: 
      type: observationPeriodEnum 
      defaultValue: observationPeriodEnum.Daily 

Naturalmente, questo modificatore fullfils sua promessa, solo fino a quando i nomi enum non interferiscono con GraphQLEnumType nomi dei metodi e variabili esistenti (che sono attualmente: name, description, _values, _enumConfig, _valueLookup, _nameLookup, getValues, serialize, parseValue, _getValueLookup, _getNameLookup e toString - vedere la definizione di GraphQLEnumType classe attorno alla riga 687 in https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L687)

risposta

1

ho appena incontrato questo. Il mio enum:

const contributorArgs = Object.assign(
    {}, 
    connectionArgs, { 
    sort: { 
     type: new GraphQLEnumType({ 
     name: 'ContributorSort', 
     values: { 
      top: { value: 0 }, 
     }, 
     }) 
    }, 
    } 
); 

In mie domande, che stavo facendo:

... on Topic { 
    id 
    contributors(first: 10, sort: 'top') { 
    ... 
    } 
} 

Risulta semplicemente non citi il ​​valore (che dopo averci pensato ha un senso, è un valore nel enum tipo, non un valore effettivo:.

... on Topic { 
    id 
    contributors(first: 10, sort: top) { 
    ... 
    } 
} 
+0

Ciao @Matthew Herbst, grazie per aver esaminato e condiviso la tua esperienza, che si riferisce a un valore letterale enumerato in una query GQL (ovvero, in "runtime"). La mia domanda riguardava comunque la * dichiarazione dello schema *: come accedere ad uno dei valori enumerati, usando un simbolo piuttosto che duplicare il valore letterale, mentre dichiari lo schema stesso? - che, in «schema design time», piuttosto che «query-time/runtime». – Olivier

0

E 'possible dichiarare valori enum come ingressi di default tramite il linguaggio di definizione dello schema, ma sembra che si sta utilizzando solo le API della libreria JS potrebbe essere un per ottenere una soluzione prendendo un look at the ASTs per l'esempio di lavoro e da ciò che il tuo codice JS sta producendo.

Scusate non una soluzione, ma speriamo che sia d'aiuto!

Problemi correlati