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