如何使用 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 的数据,我可以这样做并在响应中同时包含 errorsdata 吗?


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

ELK通过Kibana设置Elasticsearch最大返回条数

如何查询具有 ActiveStorage 附件的记录?

12306买票怎么选座位

年后返深近半月总结(20190211--20190224)

HQLhibernate查询语言hql