2015-11-30 13 views
5

In GraphQL, sto provando a creare un tipo di oggetto GeoJSON.In GraphQL, come posso specificare gli array annidati come un tipo di campo?

Quando ho specificare un allineamento a 4 dimensioni di GraphQLFloat s, ottengo un errore quando inizio il mio server:

Error: Decorated type deeper than introspection query. 

La definizione del tipo simile a questa:

var GraphQLGeoJSON = new GraphQLObjectType({ 
    name: 'GeoJSON', 
    fields: { 
    type: { 
     type: GraphQLString, 
     resolve: (obj) => obj.type, 
    }, 
    coordinates: { 
     type: new GraphQLList(new GraphQLList(new GraphQLList(new GraphQLList(GraphQLFloat)))), 
     resolve: (obj) => obj.coordinates, 
    } 
    } 
}); 

Come posso risolvere questo errore? Questo è dove è gettato nella fonte:

https://github.com/graphql/graphql-js/blob/568dc52a4f9cc9bdec4f9283e6e528970af06cde/src/utilities/buildClientSchema.js#L105

risposta

6

abbiamo finito per definire un tipo scalare GeoJSON invece di un tipo di oggetto. Ciò ci consentirebbe di eseguire rigorose convalide contro le specifiche GeoJSON. Per ora, solo per tenerci in movimento, abbiamo definito un (del tutto non implementato) Tipo GeoJSON personalizzato:

var GeoJSON = new GraphQLScalarType({ 
    name: 'GeoJSON', 
    serialize: (value) => { 
     // console.log('serialize value', value); 
     return value; 
    }, 
    parseValue: (value) => { 
     // console.log('parseValue value', value); 
     return value; 
    }, 
    parseLiteral: (ast) => { 
     // console.log('parseLiteral ast', ast); 
     return ast.value; 
    } 
}); 

... che ci permette di usare in questo modo:

var Geometry = new GraphQLObjectType({ 
    name: 'Geometry', 
    fields:() => ({ 
     id: globalIdField('Geometry'), 
     geojson: { 
      type: GeoJSON, 
     }, 
    }, 
}; 

Si potrebbe utilizzare questa strategia per definire un tipo personalizzato per rappresentare una matrice di matrici o definire un tipo personalizzato per rappresentare solo gli array nidificati, quindi utilizzare new GraphQLList(CoordinatesType), ecc. Dipende dai dati che si stanno modellando.