如何使用Graphql-kotlin查询同时返回数据字段和错误字段

时间:2019-06-21 23:48:42

标签: kotlin graphql

我正在一台服务器上解决GraphQL查询。我使用了graphql-kotlin库:https://github.com/ExpediaDotCom/graphql-kotlin

我定义了三个解析函数(可以看作三个字段):getxxx(arguments ...),getTarget(arguments ...)和getSource(arguments ...)。

问题是,如果我查询的字段之一失败,我只会得到“错误”字段。删除所有其他成功执行的结果(数据)。 如果我尝试为失败的字段捕获异常,那么我最终将不会获得“错误”字段。

这是发生异常并丢弃所有获取的数据的图像: This is the image that had exception and dropped all fetched data

目标是同时返回“数据”字段中成功获取的数据和“错误”字段中失败字段的错误消息。 我已经检查过:How to return both error and data in a graphql resolver? 如果我设置了一个有意抛出一个错误或异常的字段,那么我最后只会得到“ errors”字段(如上图所示)。

此外,许多类似这样的网站:https://itnext.io/the-definitive-guide-to-handling-graphql-errors-e0c58b52b5e1建议我们应返回部分结果和错误消息,但是在我的情况下,如果遇到异常,将仅返回错误消息。

1 个答案:

答案 0 :(得分:1)

在示例应用程序中,我们有两个顶级查询

{
  onlyCake(msg: "cake")
  generateNumber
}

如果我运行此代码,它将返回一个随机数,而onlyCake返回字符串<3。但是,如果我将onlyCake的输入修改为不是字符串cake的内容,则会出现错误。这是预期的,因为字段onlyCake具有实现此行为的指令。

https://github.com/ExpediaDotCom/graphql-kotlin/blob/2961b64d6e4cceb4034aec198d667e5f965decd2/example/src/main/kotlin/com/expedia/graphql/sample/directives/CakeOnlyDirectiveWiring.kt#L18-L19

Screen Shot 2019-06-25 at 5 11 45 PM

但是问题是,如果我仍要返回generateNumber的数据,我可以这样做吗,并且在响应中同时包含errorsdata吗?


答案是可能的,但当前模式不行。问题是我们的onlyCakegenerateNumber的架构都是不可为空的字段。因此,作为客户端,如果我看到有一个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