在graphql API之上构建新应用程序时,我们遇到了以下问题:
我们有一个带有输入字段的变异,其类型是具有自己的验证规则的自定义标量(在这种情况下,输入是格式良好的电子邮件地址).
在客户端,应用程序的用户填写了一堆字段并点击提交.目前,电子邮件地址的验证由GraphQL层处理,如果失败并出现顶级错误,则中止该突变.所有其他字段的验证由变异处理,返回变异有效负载中的应用级错误.在这种情况下的其他验证不能直接在模式中表示,因为它们涉及相互依赖的字段.
这种行为对客户来说真的没有用处:它现在必须知道两个可能位置的错误(顶级graphql错误,以及突变有效负载中的应用程序错误)以及两种可能的格式.这也意味着在修复所有架构级问题之前,不会报告其Graphitive架构中未表示格式错误的其他格式错误的字段,从而迫使用户经历多轮"修复错误,点击提交,得到另一个错误".
这个问题的标准解决方案是什么?在客户端上进行验证(在这种情况下非常复杂)?弱化模式以便在应用程序层对所有相关验证进行分组?
顶级graphql错误,以及变异有效负载中的应用程序错误
您在架构级别和应用程序级别错误之间的区别基于GraphQL类型和变异实现.客户端应用程序通常期望更高的抽象级别的错误,即,它需要区分用户错误和系统错误.这样它就可以将系统错误掩盖为"内部错误",并在必要时显示用户错误.开发人员还可以检查系统错误集.
请参阅Konstantin Tarkus关于此的一篇精彩而简洁的文章:GraphQL Mutations中的验证和用户错误,我在本回答中遵循了这些方法.
据我所知,没有特别的标准方法.但是,您可以尝试以下方法.
{
"data": {
"viewer": {
"articles": {
"edges": [
{
"node": {
"title": "Sample article title",
"tags": null
}
}
]
}
}
},
"errors": [
{
"message": "Cannot read property 'bar' of undefined",
"locations": [
{
"line": 7,
"column": 11
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
其次,将用户级错误作为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, … ]
Run Code Online (Sandbox Code Playgroud)
上述方法使客户端能够在单个位置errors(变异有效负载的字段)中以定义的格式查找用户错误.它还允许客户端一起接收所有错误.
这种方法失去了突变输入类型的自动验证.但是,验证不会受到影响,因为输入类型的验证逻辑可以放在单独的函数中.此函数将根据需要返回验证错误,最终将放入突变有效负载的errors字段中.
顺便说一句,感谢写得好的问题!
| 归档时间: |
|
| 查看次数: |
379 次 |
| 最近记录: |