【问题标题】:Is it possible to input one argument out of two in GraphQL?是否可以在 GraphQL 中输入两个参数中的一个?
【发布时间】:2022-08-18 07:51:05
【问题描述】:

我有一种情况,我必须从给定的两个参数中输入一个参数。 假设架构是

input fruit {
     apple: Apple
     banana: banana
}

现在,如果用户输入苹果,那么他就不能输入香蕉,反之亦然。这在 GraphQL 中可行吗?

  • 我会让它们成为可选的,并通过强制执行您描述的规则的方法来创建/更新它们。我相信在 TypeGraphQL 中你可以通过 FieldResolver 来做到这一点。一些 ORM,比如 TypeORM 甚至有像 @BeforeInsert@BeforeUpdate 这样的装饰器,你可以使用它们。
  • 就我而言,我只需要接受一个输入(任何一个)。如果用户通过一个输入,那么他不应该能够输入另一个输入。所以,我不能让它们成为可选的。
  • 为什么不?您创建一个InputType,它们都是可选的。在更新/创建之前,您只需验证。如果两者/都没有通过,则返回验证错误。您甚至可以选择是否希望客户传入null 或不填写该字段。

标签: kotlin graphql typegraphql apollo-federation netflix-dgs


【解决方案1】:

保持你当前的模式定义(你现在有两个可选的)。然后,如果两者都添加,您可以添加以下代码以引发错误。 (它是java代码,但确实解释了如何去做)

@DgsQuery
public String hello(@InputArgument Fruit fruit) {
   if (fruit.getApple() != null && fruit.getBanana() != null) {
      throw new DgsInvalidInputArgumentException("Only one fruit is allowed", null);
   }
}

您可以使用 GraphQLError 对象创建自定义错误或抛出您自己的异常,然后为其编写处理程序。

无论如何,如果您正在寻找仅模式的解决方案,那么这是不可能的。 GraphQL 规范不支持这种开箱即用的场景。

【讨论】:

    【解决方案2】:

    根据您的要求,另一个选项是使用 @oneOf 指令。该指令在RFC #825 中,目前处于 RFC 2 状态(草案状态;RFC 3 为接受状态),应该很快就会进入主分支。

    OneOf Input Objects 是 Input Objects 的一种特殊变体,其中类型系统断言必须设置其中一个字段且非空,而忽略所有其他字段。

    使用此指令,您的架构将如下所示:

    input fruit @oneOf {
         apple: Apple
         banana: banana
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多