我正在一台服务器上解决GraphQL查询。我使用了graphql-kotlin库:https://github.com/ExpediaDotCom/graphql-kotlin。
我定义了三个解析函数(可以看作三个字段):getxxx(arguments ...),getTarget(arguments ...)和getSource(arguments ...)。
问题是,如果我查询的字段之一失败,我只会得到“错误”字段。删除所有其他成功执行的结果(数据)。 如果我尝试为失败的字段捕获异常,那么我最终将不会获得“错误”字段。
目标是同时返回“数据”字段中成功获取的数据和“错误”字段中失败字段的错误消息。 我已经检查过:How to return both error and data in a graphql resolver? 如果我设置了一个有意抛出一个错误或异常的字段,那么我最后只会得到“ errors”字段(如上图所示)。
此外,许多类似这样的网站:https://itnext.io/the-definitive-guide-to-handling-graphql-errors-e0c58b52b5e1建议我们应返回部分结果和错误消息,但是在我的情况下,如果遇到异常,将仅返回错误消息。
答案 0 :(得分:1)
在示例应用程序中,我们有两个顶级查询
{
onlyCake(msg: "cake")
generateNumber
}
如果我运行此代码,它将返回一个随机数,而onlyCake
返回字符串<3
。但是,如果我将onlyCake
的输入修改为不是字符串cake
的内容,则会出现错误。这是预期的,因为字段onlyCake
具有实现此行为的指令。
但是问题是,如果我仍要返回generateNumber
的数据,我可以这样做吗,并且在响应中同时包含errors
和data
吗?
答案是可能的,但当前模式不行。问题是我们的onlyCake
和generateNumber
的架构都是不可为空的字段。因此,作为客户端,如果我看到有一个data
字段,那么我应该期望看到两者都存在,否则我的代码中将出现解析问题。这就是为什么我们无法在架构中保持这种行为。如果要实现此行为,架构开发人员需要确定他们可以在哪里返回一些响应并使用DataFetcherExceptionHandler
或者另一个选择是,我们支持graphql-java
中的行为以返回DataFetcherResult<T>
而不是从kotlin函数返回T
。请参见此处的Returning data and errors
部分:https://www.graphql-java.com/documentation/v13/execution/
我创建了一个问题以继续与其他团队成员进行讨论:https://github.com/ExpediaDotCom/graphql-kotlin/issues/244