【问题标题】:In GraphQL, how to handle the `resolveType` and `isTypeOf` when use the `interfaces` feature a lot?在 GraphQL 中,当大量使用 `interfaces` 特性时,如何处理 `resolveType` 和 `isTypeOf`?
【发布时间】:2017-09-14 03:30:01
【问题描述】:

我已经阅读了这个伟大的要点 - GraphQLInterfaceType

但还是有一些困惑:

  1. 真的有必要为所有 GraphQL 模式类型定义 ES6 classes 吗?
    • 这里的主要问题是:我们最终会得到大量空的ES6 classes 和等量的GraphQL types
  2. 如果不是,那么在大量使用interfaces功能时如何正确处理resolveTypeisTypeOf
  3. 即使我为所有GraphQL types 定义了所有ES6 classes,但是原始数据是在不同的地方用不同的技术构建的,比如grpc+protobuf,这与这些类定义没有任何关系,那么@ 987654331@在这里工作?

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    resolveTypeisTypeOf 的实现非常灵活,原因是:它非常特定于应用程序。这取决于数据库、数据模型、类型的相似程度相似程度等等。一些后端可能对所有模型都有单独的 ES6 类,尤其是在使用 ORM 时,它会在您查询数据库时创建这些类的实例。但是 ORM 不是必需的。而且您不应该被要求实例化任何其他类来确定 GraphQL 类型。

    在某些情况下,您可以仅根据对象的属性来确定类型。如果您的应用不是这种情况,您可以采取一些措施来提供提示。这是一个 SQL 示例。

    SELECT
      id,
      body,
      author_id,
      post_id,
      'Comment' AS "$type" -- leave a hint to resolve the type
    FROM comments
    UNION
    SELECT
      id,
      body,
      author_id,
      NULL AS post_id,
      'Post' AS "$type" -- leave a hint to resolve the type
    FROM posts
    

    这个查询提供了一个“类型提示”,一个额外的计算列,所以实现resolveType 是一个简单的属性查找。其他 DBMS 可以使用类似的策略。

    【讨论】:

    • 值得注意的是,除了“提示”,您还可以只返回一个名为 __typename 的属性,并使用适当的类型名称,在这种情况下,您不必提供 resolveTypeisTypeOf 函数。 GraphQL 的默认 isTypeOf 函数会查找该属性并以此方式推断类型。
    猜你喜欢
    • 2020-09-22
    • 2021-11-23
    • 2019-03-03
    • 2020-11-07
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多