【问题标题】:Creating conditional properties in GraphQL type definition在 GraphQL 类型定义中创建条件属性
【发布时间】:2020-06-24 10:17:06
【问题描述】:

我正在使用 Apollo 框架设置 GraphQL 服务器。

它将有一个名为Shelf 的实体。一个Shelf 有一个shelfIdpackages

我需要能够使用shelfIdpackageCode 查询Shelves

我的数据源可以处理这两种情况,但我希望为此使用 1 个名为 shelf 的解析器。

例子

query getShelf(shelfId: "1") {
  shelfId
}

或:

query getShelf(packageCode: "123") {
  shelfId
}

如果设置了packageCodeshelfId,我如何定义检查类型?

  • 如果提供packageCode,则不需要shelfId
  • 当提供shelfId 时,不需要packageCode
  • 当我们都没有提供它们中的任何一个时

我认为我唯一的选择是:

  • A) 为每个场景创建单独的解析器
  • B) 将它们设为可选并从解析器返回错误。

我将如何进行?

【问题讨论】:

    标签: types graphql apollo


    【解决方案1】:

    目前没有语法支持将两个参数之一设为非空。您必须使这两个参数都可以为空,然后将验证逻辑添加到您的解析器。

    或者,如果两个参数的类型相同,您可以这样做:

    type Query {
      getShelf(id: ID! idType: ShelfIdType!)
    }
    
    enum ShelfIdType {
      SHELF_ID
      PACKAGE_CODE
    }
    

    我认为这不一定更好,但如果您想完全依赖 GraphQL 的类型系统进行验证,这是一个选择。

    【讨论】:

    • 感谢您的建议。我还没有考虑为此使用枚举,你是对的,我只想依靠 GraphQL 类型系统进行验证。
    • 这不是您真正会在野外看到的模式,因为它非常有限,并且对于使用您的 API 的任何人来说都可能不直观。但是YMMV。
    【解决方案2】:

    您可以使用一个解析器来处理它。上面提到的丹尼尔的回答也是其中一种方式。

    您也可以将两者作为单独的参数。

    type Query {
      getShelf(SHELF_ID: ID, PACKAGE_CODE:ID)
    }
    

    在解析器中,您可以检查存在哪个参数并编写逻辑以相应地获取数据。

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      相关资源
      最近更新 更多