在GraphQL中,如何将嵌套数组指定为字段类型?

时间:2015-11-30 18:22:54

标签: graphql-js

在GraphQL中,我正在尝试创建一个GeoJSON对象类型。

当我指定GraphQLFloat的4维数组时,启动服务器时出错:

Error: Decorated type deeper than introspection query.

类型定义如下所示:

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,
    }
  }
});

如何解决此错误?这是源于它的地方:

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

1 个答案:

答案 0 :(得分:6)

我们最终定义了GeoJSON标量类型而不是对象类型。这将允许我们对GeoJSON规范执行严格的验证。目前,为了让我们继续前进,我们定义了一个(完全未实现的)自定义GeoJSON类型:

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;
    }
});

...允许我们像这样使用它:

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

您可以使用此策略定义自定义类型以表示数组数组,或定义自定义类型以仅表示嵌套数组,然后使用new GraphQLList(CoordinatesType)等。这取决于您的数据&# 39;重新建模。