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

不一致的类型名错误

不一致的 __typename 错误

GraphQL 服务器可能违反了全局唯一 ID 要求,返回了不同对象的相同 ID。

如果你看到类似这样的错误

RelayResponseNormalizer: 无效记录 '543'。预期 __typename 一致,但记录被分配了冲突类型 Foo 和 Bar。GraphQL 服务器可能违反了全局唯一 ID 要求,返回了不同对象的相同 ID。

其中一个类型的服务器实现不符合规范。我们要求 id 字段是全局唯一的。这是一个问题,因为 Relay 将对象存储在规范化的键值存储中,而其中一个对象覆盖了另一个。这意味着你的应用程序在某种程度上出现了问题,可能是比较微妙的,也可能比较明显。

常见原因

此错误最常见的原因是两个由 ID 支持的对象使用普通 ID 作为 id 字段,例如 UserMessagingParticipant

不常见的原因可能是使用数组索引或来自某些数据库的自增 ID,这些 ID 可能对该类型不唯一。

修复: 使你的类型符合规范

解决这个问题的最佳方法是使你的类型符合规范。对于由同一个 ID 支持的两个不同类型的情况,一个常见的解决方案是使用一个唯一的字符串作为前缀为使用较少的类型的 ID,然后对结果进行 Base64 编码。这可以通过使用辅助特征 NodeTokenResolverWithPrefix 实现 NodeTokenResolver 来轻松实现。当 NodeTokenResolver 注册后,它允许你使用 node(id: $yourID) GraphQL 调用加载你的类型,并且你的类型可以返回一个编码后的 ID。