GraphQL CodeGen - 使用单个请求执行任意次数的相同突变

Posted

技术标签:

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

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

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

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

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

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

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

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

【问题讨论】:

【参考方案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 操作分组(您可以自定义时间跨度)。

【讨论】:

以上是关于GraphQL CodeGen - 使用单个请求执行任意次数的相同突变的主要内容,如果未能解决你的问题,请参考以下文章

typescript 和 graphql-codegen 之间的枚举不匹配

Apollo Server:Eject 内置“上传”类型以使用 graphql-codegen 生成 TS 类型

如何使用 apollo 客户端从 schema.graphql 中提取 typescript 接口:codegen

graphql-codegen 没有与配置文件一起运行

如何在 typescript/javascript 导出中使用字符串模板来处理 graphql-codegen 架构

Graphql codegen 配置不使用 Glob 表达式加载文档