0

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

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

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

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

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

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

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

4

2 回答 2

2

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

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

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

于 2020-07-30T13:29:35.753 回答
0

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

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

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

于 2020-07-30T13:32:01.423 回答