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

不一致的類型名稱錯誤

不一致的 __typename 錯誤

GraphQL 伺服器可能違反了全域唯一 ID 的要求,為不同的物件傳回了相同的 ID。

如果你看到類似以下的錯誤:

RelayResponseNormalizer: Invalid record '543'. Expected __typename to be consistent, but the record was assigned conflicting types Foo and Bar. The GraphQL server likely violated the globally unique ID requirement by returning the same ID for different objects.

其中一個類型的伺服器實作不符合規範。我們要求 id 欄位必須是全域唯一的。這會造成問題,因為 Relay 將物件儲存在標準化的鍵值儲存區中,而其中一個物件覆寫了另一個物件。這表示你的應用程式在某些細微或不太細微的地方出了問題。

常見原因

這個錯誤最常見的原因是,由 ID 支援的兩個物件使用了純 ID 作為 id 欄位,例如 UserMessagingParticipant

較不常見的原因可能是使用了陣列索引或來自某些資料庫的自動遞增 ID,這些 ID 對於此類型可能不是唯一的。

修正:讓你的類型符合規範

修正這個問題的最佳方法是讓你的類型符合規範。對於由相同 ID 支援的兩個不同類型的情況,常見的解決方案是在較不常用的類型的 ID 前加上唯一的字串,然後對結果進行 base64 編碼。可以使用輔助特性 NodeTokenResolverWithPrefix 輕鬆地實作 NodeTokenResolver。當 NodeTokenResolver 註冊時,你可以使用 node(id: $yourID) GraphQL 呼叫載入你的類型,並且你的類型可以傳回一個編碼的 ID。


這個頁面有用嗎?

幫助我們讓網站變得更好,請 回答幾個簡單的問題.