错误处理
就像 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 以相同的方式处理。