【问题标题】:GraphQL CodeGen - perform same mutation an arbitrary number of times with a single requestGraphQL CodeGen - 使用单个请求执行任意次数的相同突变
【发布时间】:2020-11-20 05:26:07
【问题描述】:

我定义了一个突变,允许用户复制他们的产品,一次一个产品:

mutation DuplicateProduct($productID: ID!) {
  duplicateProduct(productID: $productID) {
    id
  }
}

现在我必须实现一个功能,它允许用户一次复制多个产品。

一个明显的解决方案是重新设计架构以接受多个产品 ID。如果可能,我想避免这项工作。

另一种选择是简单地连续多次发布相同的突变,但似乎使用 CodeGen 生成突变服务的方式,我必须发送多个单独的 HTTP 请求。

我的问题是:是否可以使用 CodeGen 生成的服务在单个请求中批量处理动态数量的突变?如果我不使用 CodeGen,批处理似乎会很容易,因为我可以动态地动态创建突变定义。然而,CodeGen 似乎强制执行相当静态的操作定义。

有没有一种很好的方法来实现我正在寻找的东西?我也可能走错了路,所以如果大多数graphql-y解决方案实际上需要重新设计架构,如果有人向我指出这一点,我会很高兴。types

【问题讨论】:

    标签: typescript graphql graphql-codegen


    【解决方案1】:

    最佳解决方案是创建一个新的突变字段来支持此功能,因为这样您可以优化应用程序执行实际写入操作的方式(即单个数据库调用而不是多个)。如果您的数据源要求您为每个产品向它发出多个请求,无论如何,您可能希望能够撤消在任何单个操作失败时完成的所有工作。

    假设您使用的是 Apollo 客户端,您还可以使用链接 that does batching,这样即使您对变异服务进行单独调用,它们也会被批处理到单个 GraphQL 请求中。

    如果您需要某种方式来使用 codegen 进行动态操作,您可以提交功能请求问题。然而,这似乎是一个极端情况——如果架构缺少客户端需要的功能,那么最好尝试在架构中实现该功能,而不是尝试在客户端解决它。如果您在客户端解决它,则必须为您拥有的每个客户端应用程序执行一次。

    【讨论】:

      【解决方案2】:

      将 codegen 视为开发工具,而不是运行时库,因此它应该提供类型和生成代码。您提到的功能是指您的应用的运行时行为。

      GraphQL-Codegen 不处理此类功能,但您可以创建一个自定义插件来创建您需要的分组操作 (https://graphql-code-generator.com/docs/custom-codegen/index)。

      我认为在运行时分组操作的最佳方式是使用批处理解决方案。如果您使用的是 Apollo-Client,您可以使用 apollo-link-batch-http (https://www.apollographql.com/docs/link/links/batch-http/),它将一起执行的 GraphQL 操作分组(您可以自定义时间跨度)。

      【讨论】:

        猜你喜欢
        • 2021-09-25
        • 2019-04-07
        • 2020-09-02
        • 2019-02-08
        • 2021-01-13
        • 2018-11-26
        • 2022-08-13
        • 2014-03-01
        相关资源
        最近更新 更多