从第三方库创建GeoJSON GraphQL模式

时间:2018-10-11 20:54:53

标签: graphql apollo-server express-graphql

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

该库提供了解析器,但是我还没有找到一种无需手动写出即可将其添加到架构定义中的方法。即便如此,这还没有证明那么简单。

另一种自定义类型,日期graphql-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
    }
  }
}

是否可以将库提供的类型与我的架构合并?

1 个答案:

答案 0 :(得分:1)

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

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

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