メインコンテンツへスキップ
バージョン: v18.0.0

一貫性のない型名エラー

一貫性のない__typenameエラー

GraphQLサーバーがおそらく、異なるオブジェクトに対して同じIDを返すことで、グローバルに一意なIDの要件に違反しています。

次のようなエラーが発生した場合:

RelayResponseNormalizer: 無効なレコード '543'。 __typename が一貫していることが期待されましたが、レコードには Foo と Bar という競合する型が割り当てられました。 GraphQLサーバーは、異なるオブジェクトに対して同じIDを返すことで、グローバルに一意なIDの要件に違反している可能性があります。

いずれかの型のサーバー実装が仕様に準拠していません。 idフィールドはグローバルに一意である必要があります。これは、Relayが正規化されたキーと値のストアにオブジェクトを格納し、一方のオブジェクトがもう一方のオブジェクトを上書きしてしまうため、問題になります。これは、アプリが微妙またはそれほど微妙ではない方法で壊れていることを意味します。

一般的な原因

このエラーの最も一般的な理由は、IDによってサポートされている2つのオブジェクトが、UserMessagingParticipantのように、プレーンなIDをidフィールドとして使用していることです。

あまり一般的ではない理由としては、この型に対して一意ではない可能性のある、配列インデックスや一部のデータベースからの自動インクリメントIDの使用などが考えられます。

修正:型の仕様を準拠させる

これを修正する最良の方法は、型の仕様を準拠させることです。同じIDによってサポートされる2つの異なる型の場合、一般的な解決策は、あまり広く使用されていない型のIDに一意の文字列をプレフィックスとして付加し、その結果をbase64エンコードすることです。これは、ヘルパートレイトNodeTokenResolverWithPrefixを使用してNodeTokenResolverを実装することで、かなり簡単に行うことができます。NodeTokenResolverが登録されると、node(id: $yourID) GraphQL呼び出しを使用して型をロードできるようになり、型はエンコードされたIDを返すことができます。


このページは役に立ちましたか?

サイトをさらに改善するために、ご協力をお願いします。 いくつかの簡単な質問に回答する.