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 以半智能的方式处理这个问题,但这种类型的决定确实应该留给您的用户。
考虑到解析器是一回事,而突变是承诺,我可以想出几种方法来做到这一点。
非 GraphQL 解决方案:在 DB 级别更新,我不知道你的数据库技术,但他们中的很多人都有一个 "Upsert" 命令“你可以使用。
在解析器中加入条件:
.
resolver(_, args) {
if (myDB.find(args.username) === null) {
createNewUser();
}
- 有条件的承诺链,客户端
.
mutation1(credentials).then(result => {
if (result) {
mutation2.then();
else {
mutation3.then();
}
}
考虑到这是登录,为了安全起见,我将处理所有服务器端。
因为你可以在一个突变中有多个连续的步骤运行,你能不能在 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 以半智能的方式处理这个问题,但这种类型的决定确实应该留给您的用户。
考虑到解析器是一回事,而突变是承诺,我可以想出几种方法来做到这一点。
非 GraphQL 解决方案:在 DB 级别更新,我不知道你的数据库技术,但他们中的很多人都有一个 "Upsert" 命令“你可以使用。
在解析器中加入条件:
.
resolver(_, args) {
if (myDB.find(args.username) === null) {
createNewUser();
}
- 有条件的承诺链,客户端
.
mutation1(credentials).then(result => {
if (result) {
mutation2.then();
else {
mutation3.then();
}
}
考虑到这是登录,为了安全起见,我将处理所有服务器端。