0

我正在尝试在 Apollo/Express 应用程序中使用graphql-geojson库来提供 GeoJSON 响应。

该库提供了解析器,但我还没有找到一种方法来将类型添加到我的模式定义中,而无需手动将它们写出来。即便如此,事实证明也不是那么简单。

另一种自定义类型,来自graphql-date 的 Date,我可以在模式中声明为自定义标量:

const typeDefs: DocumentNode = gql`
  scalar Date
  scalar PointObject

  type Station {
    id: ID!
    name: String!
    geom: PointObject
    created: Date!
  }
  ...
}

但是,将 PointObject 声明为标量可以让您获得完整的 GeoJSON(没问题),但会导致错误:

"GraphQLError: 字段 \"geom\" 不能有选择,因为类型 \"GeoJSONPoint\" 没有子字段。"

当您尝试返回 的子选择时geom,例如:

{
  stations {
    id
    name
    geom {
      coordinates
    }
  }
}

有没有办法将库提供的类型与我的模式合并?

4

1 回答 1

1

Apollo 的graphql-tools库包含一个 mergeSchemas 函数,它可以将多个模式和模式位组合在一起。您应该能够使用它从您的类型定义中构建一个大模式(未经测试):

import * as GeoJSON from 'graphql-geojson';
import { mergeSchemas } from 'graphql-tools';

const typeDefs = `
  type Station {
    id: ID!
    name: String!
    geom: PointObject
    created: Date!
  }
`;

const schema = mergeSchemas({
  schemas: [Object.values(GeoJSON), typeDefs]
});

(请注意,graphql-geojson 定义的类型有点涉及;它们绝对不是单一的标量类型,如果可以避免的话,我不想尝试在我的模式定义中重新输入它们。)

于 2018-10-11T22:28:26.847 回答