graphql 是否允许有条件地执行突变中的步骤?

Does graphql allow conditional execution of a step in a mutation?

因为你可以在一个突变中有多个连续的步骤运行,你能不能在 graphql 中有一个条件 if 语句,这样后面的步骤只有 运行 如果前一步的结果满足条件?

例如

 mutation upsertLogin($idToken: String!, $email: String!, $username: String!) {

    User(email: $email, username: $username) {
      id
    }

    // only do the next step if no id from from previous step

    createUser(email: $email, username: $username) {
      id
    }

  }

不,GraphQL 不支持这种条件执行。唯一明确支持的是在一个突变中抛出错误,以防止其余突变 运行ning。这是有效的,因为突变运行顺序。

理论上,您可以通过写入上下文然后从上下文读取来实现您提到的条件,上下文在所有解析器之间共享,但我不建议这样做,因为 GraphQL 的某些实现明确声明了上下文不可变的。

如果找不到用户,您可以让解析器为您执行此操作,但是如果人们尝试使用错误的凭据登录,那么您 运行 就会陷入创建重复帐户和混淆用户的问题.

我绝对鼓励您不要尝试实施它,因为它不是很好的用户体验模式。如果找不到用户,可能有多种原因(密码错误、电子邮件地址错误、帐户无效...)

GraphQL does/could 以半智能的方式处理这个问题,但这种类型的决定确实应该留给您的用户。

考虑到解析器是一回事,而突变是承诺,我可以想出几种方法来做到这一点。

  1. 非 GraphQL 解决方案:在 DB 级别更新,我不知道你的数据库技术,但他们中的很多人都有一个 "Upsert" 命令“你可以使用。

  2. 在解析器中加入条件:

.

resolver(_, args) {
  if (myDB.find(args.username) === null) {
     createNewUser();
  }
  1. 有条件的承诺链,客户端

.

mutation1(credentials).then(result => {
  if (result) {
    mutation2.then();
  else {
    mutation3.then();
  }
}

考虑到这是登录,为了安全起见,我将处理所有服务器端。