【问题标题】:Best way to represent GraphQL schema表示 GraphQL 模式的最佳方式
【发布时间】:2021-02-18 23:26:59
【问题描述】:

我开始使用 graphQl 查询语言并且我使用 GraphQL 模式定义语言作为字符串类型来定义类型,但是我看到其他开发人员使用 GraphQLObjectType 函数,GraphQL 的 JavaScript 参考实现使用它来存储有关模式的信息,我很困惑关于定义模式的最佳方式,我需要知道在什么情况下我们可以使用 GraphQLObjectType

const queryType = new GraphQLObjectType({
  name: "Query",
  fields: {
    posts: {
      type: postType
    },
    author: {
      name: "author",
      type: authorType,
      arguments: { id: { type: new GraphQLNonNull(GraphQLInt) } }
    }
  }
});

GraphQL Schema Definition Language

type Author {
  id: Int!
  firstName: String
  lastName: String
  posts: [Post]
}type Post {
  id: Int!
  title: String
  author: Author
  votes: Int
}type Query {
  posts: [Post]
  author(id: Int!): Author
}

【问题讨论】:

  • 两者都有效,schema first vs code first .. 选择您的偏好

标签: javascript graphql


【解决方案1】:

“最佳方式”在很大程度上取决于您的情况。不过,我认为使用模式定义的好处值得考虑。

  • 它与语言无关。如果您需要与其他人共享此架构,或在其他工具或组件中使用它,使用 SDL 会更容易。
  • 将块组合在一起更容易。您可以在单独的文件中定义接口和类型,并根据需要将它们组合在一起。
  • 更简洁。在我看来,这让你在 6 个月后回来时更容易理解。我也认为这使得扩展和修改更容易。

出于这些原因,我相信 SDL 是最好的方法。但是,在 JavaScript 中,这两种方式都有效,因此,如果您更愿意编写代码并且上述注意事项对您来说并不重要,请坚持使用适合您的方式!

【讨论】:

  • clear,谢谢,我目前正在使用 SDL,我将继续使用它
【解决方案2】:

编辑:对不起,我回答有点太仓促了。

确实,在定义架构时,您可以这样做:

var schema = buildSchema(`
  type User {
    id: String
    name: String
  }
 
  type Query {
    user(id: String): User
  }
`);

或使用 GraphQLObjectType 等以编程方式构建您的架构。 这取决于您的用例,但如果我的架构变得很长,我还希望必须单独管理每个对象。更一般地说,这就是graphql 所说的:

如果您想从其他东西(如数据库模式)自动创建 GraphQL 模式,这将特别有用。对于创建和更新数据库记录之类的事情,您可能有一个通用格式。这对于实现无法完全映射到 ES6 类和模式语言的联合类型等特性也很有用。


这里有一些澄清:这不是一个或另一个。 GraphQL 模式定义语言用于以与语言无关的方式 来讨论 GraphQL 模式。您不能按原样使用它,它只是用于描述您的模式。由于您使用的是我假设的 Javascript,因此您必须使用该语言的库提供的内容来构建您的架构。

什么是 GraphQLObjectType?

引用docs

GraphQL 模式最基本的组件是对象类型,它仅表示您可以从服务中获取的一种对象,以及它具有哪些字段。 ...它是具有某些字段的类型。架构中的大多数类型都是对象类型。

顾名思义,就是用来描述一个对象的。 GraphQLString 来描述字符串字段等

GraphQL 服务可以用任何语言编写。由于我们不能依赖特定的编程语言语法(如 JavaScript)来讨论 GraphQL 模式,因此我们将定义自己的简单语言。我们将使用“GraphQL 模式语言”——它类似于查询语言,允许我们以与语言无关的方式讨论 GraphQL 模式。

【讨论】:

  • 谢谢,我知道 GraphQL 可以用任何语言编写,目前我使用 javascript,以上两种方式都可以,所以我很困惑
  • 确实,我没抓住重点。对不起。我会尽快修改我的答案。
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 2010-11-22
  • 2011-09-15
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多