如何使用 Graphql-kotlin 查询同时返回数据字段和错误字段
Posted
技术标签:
【中文标题】如何使用 Graphql-kotlin 查询同时返回数据字段和错误字段【英文标题】:How to return both data field and errors field with Graphql-kotlin query 【发布时间】:2019-11-04 18:47:11 【问题描述】:我正在使用一台解决 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? 如果我故意设置一个抛出一个错误或异常的字段,我最后只会得到“错误”字段(如上图)。
另外,很多这样的网站:https://itnext.io/the-definitive-guide-to-handling-graphql-errors-e0c58b52b5e1 建议我们应该返回部分结果和错误消息,但在我的情况下,如果我遇到异常,只会返回错误消息。
【问题讨论】:
【参考方案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
但问题是,如果我还想返回 generateNumber
的数据,我可以这样做并在响应中同时包含 errors
和 data
吗?
答案是可能的,但当前架构不行。问题是onlyCake
和generateNumber
的架构都是不可为空的字段。因此,作为客户,如果我看到有一个 data
字段,我应该期望看到这两个字段,否则我的代码中会出现解析问题。这就是为什么我们不能按原样使用架构的这种行为。如果您想实现此行为,架构开发人员需要决定他们可以在哪里返回 null 以获得某些响应,并使用 DataFetcherExceptionHandler
适当地修改错误字段
或者另一种选择是我们支持 graphql-java
中的行为以从 kotlin 函数返回 DataFetcherResult<T>
而不仅仅是 T
。在此处查看Returning data and errors
部分:https://www.graphql-java.com/documentation/v13/execution/
我创建了一个问题以继续与其他团队成员讨论:https://github.com/ExpediaDotCom/graphql-kotlin/issues/244
【讨论】:
以上是关于如何使用 Graphql-kotlin 查询同时返回数据字段和错误字段的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 graphql-kotlin 在 Spring Boot 服务器中添加 CORS 标头?