跳至主要内容
版本:v18.0.0

错误处理

就像 GraphQL 服务器一样,Relay 解析器支持字段级别的错误处理。如果单个解析器抛出错误,当读取该字段时,Relay 会将该错误记录到环境提供的 relayFieldLogger 日志记录器中,并且该字段将变为 null。

这为 GraphQL 服务器提供了重要的对称性。解析器旨在为团队提供一个平滑的迁移路径,使他们能够从使用解析器在客户端定义字段开始,然后最终将它们迁移到服务器。

如果解析器抛出错误,Relay 会将错误记录到用户提供的错误日志记录器中,并且将返回为解析器定义的字段的 null。为了在运行时启用此行为,Relay 编译器将不允许解析器字段被类型化为非空。

传递给 relayFieldLogger 的对象将具有以下形状

type ResolverErrorEvent = {
kind: 'relay_resolver.error',
// The name of the fragment/query in which the field was read
owner: string,
// The path from the owner root to the field which threw the error
fieldPath: string,
// The error thrown by the resolver
error: Error,
}

一个示例日志记录器可能看起来像

function fieldLogger(event) {
if(event.kind === "relay_resolver.error") {
// Log this somewhere!
console.warn(`Resolver error encountered in ${event.owner}.${event.fieldPath}`)
console.warn(event.error)
}
}

const environment = new Environment({
network: Network.create(/* your fetch function here */),
store: new LiveResolverStore(new RecordSource()),
relayFieldLogger: fieldLogger
});
注意

实时解析器 在首次评估或调用其 .read() 方法时可能会抛出错误。这两种类型的错误将由 Relay 以相同的方式处理。