Relay/ GraphQL:可为空的响应或捕获查询错误的方法

relay/ graphql: nullable response or a way to catch query error

本文关键字:查询 方法 错误 响应 Relay GraphQL      更新时间:2023-09-26

在relay/graphql中,如何表达响应可以为空的查询。我现在有一个两难境地,我无法用空/空响应响应来响应,因为中继需要id字段(以及 graphql 架构中可能的其他不可为空的字段),并且我无法发送错误,因为它停止了我的组件被渲染。

例如,假设我正在对关系层次结构进行建模,并且有一个类似

getSpouse(partnerID: string): Person

这对某些人来说可能是空的。因此,我要么使用空 Person 对象进行响应(我认为使用中继不太可行,因为 Person 可能有包括 globalID 在内的不可为空的字段),要么发送错误。发送错误是可以的,但我不确定如何捕获此错误并继续渲染中继容器。我知道在发生突变时会出错,但查询由中继容器处理,并且看不到获取错误并继续加载组件的接口。

有没有办法在 Relay 容器中捕获查询错误或将其传递给我的组件?

接力核心团队的@josephsavona评论了一种方法。https://github.com/facebook/relay/issues/487#issuecomment-232102389

一种解决方法是使用自定义网络层来解析 RelayQueryRequest 是否有任何数据(无论错误如何),以及 仅在没有数据和错误时才拒绝请求。

编辑:根据评论进行详细说明。

import { DefaultNetworkLayer } from 'react-relay';
export default class RelayNetworkLayer extends DefaultNetworkLayer {
  // override whichever methods (like sendMutation, sendQueries)
}