graphql是否允许条件执行变异中的步骤?

时间:2016-11-17 14:18:05

标签: graphql

由于你可以在一个变异中按顺序运行多个步骤,你是否可以在graphql中使用条件if语句,以便后面的步骤仅在上一步的结果满足条件时运行?

e.g。

 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
    }

  }

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

如果找不到用户,你可以让解析器为你执行此操作,但是如果人们尝试使用错误的凭据登录,那么你会遇到制作重复帐户和混淆用户的问题。

我绝对鼓励你尝试实现它,因为它不是一个很好的UX模式。如果找不到用户,可能是出于多种原因(密码错误,电子邮件错误,帐户无效......)

GraphQL可以/半智能地处理这个问题,但是这种类型的决策应该留给你的用户。

答案 2 :(得分:0)

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

  1. 非GraphQL解决方案:在数据库级别进行升级,我不知道您的数据库技术,但是他们中有很多都有" Upsert"命令"你可以使用。

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

  3. resolver(_, args) {
      if (myDB.find(args.username) === null) {
         createNewUser();
      }
    
    1. 有条件承诺链接,客户端
    2. mutation1(credentials).then(result => {
        if (result) {
          mutation2.then();
        else {
          mutation3.then();
        }
      }
      

      考虑到这是Login,我会处理所有这个服务器端以确保安全。