8

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

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

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

4

1 回答 1

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)等。这取决于您正在建模的数据。

于 2016-01-10T18:41:48.860 回答