gpt4 book ai didi

graphql - GraphQL 中模式级和应用级错误的混合

转载 作者:行者123 更新时间:2023-12-04 14:10:00 26 4
gpt4 key购买 nike

在基于 graphql API 构建新应用程序时,我们遇到了以下问题:

我们有一个带有输入字段的突变,其类型是具有自己验证规则的自定义标量(在这种情况下,输入是格式正确的电子邮件地址)。

在客户端,应用程序的用户填写一堆字段并点击提交。目前,电子邮件地址的验证由 GraphQL 层处理,如果变异失败并出现顶级错误,则中止变异。所有其他字段的验证由突变处理,在突变有效负载中返回应用程序级错误。这种情况下的其他验证不能直接在模式中表示,因为它们涉及相互依赖的字段。

这种行为对客户端真的没有帮助:它现在必须知道两个可能位置(顶级 graphql 错误,以及变异有效负载中的应用程序错误)和两种可能格式的错误。这也意味着其他格式错误的字段在 GraphQL 模式中没有表示出来,直到所有模式级别的问题都被修复后才会被报告,迫使用户经历多轮“修复错误,点击提交,得到另一个错误”。

这个问题的标准解决方案是什么?将验证(在这种情况下相当复杂)放在客户端上?弱化模式以在应用程序层对所有相关验证进行分组?

最佳答案

错误分类的问题

top-level graphql errors, and the application errors in the mutation payload



您在架构级别和应用程序级别错误之间所做的区分基于 GraphQL 类型和变异实现。客户端应用程序通常期望更高的错误抽象级别,即它需要区分用户错误和系统错误。这样,它可以将系统错误掩饰为“内部错误”,并在必要时呈现用户错误。开发人员还可以检查系统错误集。

请参阅康斯坦丁·塔库斯 (Konstantin Tarkus) 撰写的一篇关于此的简洁明了的文章: Validation and User Errors in GraphQL Mutations ,我在这个答案中遵循了他的方法。

一个不太标准但有意义的解决方案

据我所知,没有特定的标准方法。但是,您可以尝试以下方法。

首先,拥有 系统级错误 在顶级字段 errorsmutation response :
{
"data": {
"viewer": {
"articles": {
"edges": [
{
"node": {
"title": "Sample article title",
"tags": null
}
}
]
}
}
},
"errors": [
{
"message": "Cannot read property 'bar' of undefined",
"locations": [
{
"line": 7,
"column": 11
}
]
}
]
}

二、放 用户级错误 作为单独的字段 errors在变异有效载荷中。来自上述文章的示例:
{
data: {
user: null,
errors: [
'',
'Failed to create a new user account.',
'email',
'User with this email address was already registered.',
]
}
}
// The errors field is just an array of strings that follows this pattern —
// [argumentName1, errorMessage1, argumentName2, errorMessage2, … ]

上述方法使客户端能够查找 在一个地方以定义的格式出现用户错误 - errors突变有效载荷字段。它还允许客户端一起接收所有错误。

这种方法失去了对突变输入类型的自动验证。但是,验证不会受到影响,因为输入类型的验证逻辑可以放在单独的函数中。此函数将根据需要返回验证错误,最终将其放入变异有效负载的 errors 中。 field 。

顺便说一句,感谢您写得很好的问题!

关于graphql - GraphQL 中模式级和应用级错误的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37665539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com