如何在 GraphQL 中导出字段定义

Posted

技术标签:

【中文标题】如何在 GraphQL 中导出字段定义【英文标题】:How to export field definitions in GraphQL 【发布时间】:2020-04-01 00:12:44 【问题描述】:

?例如,假设我有

schema.graphql:

type Query 
  comment: String!

我可以这样做吗?

query.graphql:

const query = comment: String!;

export query;

schema.graphql:

import  query  from './query.graphql';

type Query 
  query

编辑: 这个问题背后的真正意图是如何按模式组织QuerysMutations?例如:

type Mutation 
  createComment(data: CreateCommentInput): Comment!,
  createPost(data: CreatePostInput): Post!,
  createUser(data: CreateUserInput): User!,
  deleteComment(id: ID!): Comment!,
  deletePost(id: ID!): Post!,
  deleteUser(id: ID!): User!,

现在我的应用程序只有三个对象:评论、帖子和用户。我的偏好是按模式(例如评论、帖子和用户)组织我的输入、解析器等,但这意味着在一天结束时我仍然必须将所有内容放入一个单一的 Mutation 类型中。对于可能有几十个对象和关系、突变等等的更大的应用程序,这似乎很难扩展,最好在它们各自的评论文件夹、用户文件夹等中分离出单独的突变。谢谢!

【问题讨论】:

【参考方案1】:

GraphQL 不支持任何类型的导入/导出语法。

graphql-tag 和 babel-plugin-import-graphql 等某些库支持通过 cmets 导入片段或类型定义,但这些库不支持导入单个字段定义。

充其量,您可以使用模板字符串,但您必须使用 javascript/TypeScript 文件(假设您使用的是 Node.js 服务器,但您的问题并不完全清楚)。

fields.js

export const fields = `
  comment: String!
`

query.js

import  fields  from './fields' 

export const typeDefs = `
  type Query 
    $fields
  
`

不过,归根结底,您的类型定义之间不太可能有足够的重复来保证执行这样的操作。除非你有几十种类型的几十个公共字段,否则我只会处理重复。

如果您只是想跨多个文件模块化架构,您可以使用extend 创建多个类型定义,这些类型定义将合并为一个。例如:

type Query 
  someField: String!


extend type Query 
  someOtherField: String!


extend type Query 
  yetAnotherField: String!

并不是说你仍然必须定义你要扩展的类型——你不能有引用不存在的类型的扩展。然而,当使用扩展时,你的“基本”类型不一定必须有字段(只要你至少有一个扩展)。所以你也可以这样做:

type Query # Note the lack of curly brackets

extend type Query 
  someOtherField: String!

还有一些库,比如this one,可以让您在不使用extend 关键字的情况下合并类型定义。这种程序化合并存在一些已知问题,但 YMMV。

最后,虽然我个人喜欢以这种方式做事,但您可能会发现 this pattern 有助于组织您的架构。

【讨论】:

谢谢!请查看我的编辑并提出其他问题。

以上是关于如何在 GraphQL 中导出字段定义的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GAE 数据存储中导出 BLOB 类型字段?

如何在类型定义中为 GraphQL 字段定义数组数据类型

如何在 GraphQL 中访问 ACF 关系字段中的自定义字段?

如何在 graphQL 片段中定义可选字段以进行查询

如何从 C 中导出结构的字段

GraphQL - 自定义字段 [重复]