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

问题描述:

由于您可以在突变中按顺序运行多个步骤,您是否可以在graphql中使用条件if语句,以便后面的步骤仅在前一步的结果满足条件时才会运行?graphql是否允许突变中的某个步骤的条件执行?

例如

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不支持这种条件执行。唯一明确支持的是在一个突变中引入一个错误,以防止剩余的突变运行。这是有效的,因为突变顺序运行

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

如果用户没有找到,您可能可以让解析器为您做这件事,但是如果人们尝试使用错误的凭据登录,那么您会遇到制作重复帐户和混淆用户的问题。

我一定会鼓励你而不是尝试和实现这一点,因为它不是一个伟大的UX模式。如果没有找到用户,可能是由于多种原因(错误的密码,错误的电子邮件,不活动的帐户...)

GraphQL确实/可以以半智能方式处理此问题,但此类型决定真的应该留给你的用户。

+0

在我的用例中,这是由auth0用户创建触发的,所以它只会在验证身份验证事件的情况下触发 - 并用于将auth0用户信息与相应的后端服务同步。因此,它总是只有一个原因,而不是用户错误等等。 – MonkeyBonkey

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

  1. 非GraphQL解决方案:在的Upsert在DB的水平,我不知道你的数据库技术,但很多人有一个“的Upsert”命令”,您可以使用

  2. 将一个条件解析器:

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

    考虑到这是登录,我会处理所有这些服务器端的安全。

开始=>