如果你有使用 Firebase Cloud Function 存取 Firestore,有時你會遇到 FAILED_PRECONDITION 這個讓人摸不著頭緒的錯誤。

錯誤訊息大概長這樣。

Error: 9 FAILED_PRECONDITION:
    at entryFromArgs (/workspace/node_modules/firebase-functions/lib/logger/index.js:130:19)
    at Object.error (/workspace/node_modules/firebase-functions/lib/logger/index.js:116:11)
    at httpFunc (/workspace/node_modules/firebase-functions/lib/v2/providers/scheduler.js:71:20)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

這其實是 Cloud Funcition 把錯誤訊息過濾掉了。如果有顯示,你會知道是因為 index 沒有建立,而且還會顯示應該建立 index 的連結,你只需點擊就好。Firestore 在做複雜的查詢時,需要你先建立 index。

正常來說,你在查看 logs ,應該要能看到 traceback。很不巧的,traceback 被過濾掉了,所以你看 logs 是問道於盲。

Google 的人說他們還是不知道爲什麼會消失,建議你在本地端執行複雜的 query,這樣你就能看到 Traceback。

[!quote] We still don't know why the text is stripped from the error. However, the resolution remains the same. Create the required composite index. For now you will need to run the code locally (or not within cloud function), and then there will be a helpful link as part of error.

可是呢?這個錯誤並不能在 Firebase 模擬器抓出來,因為模擬器不會要求使用 Index,並且在近期也沒有支援這功能的計畫(2027)。換言之,你要直接在本地端連到真正的 firestore database。老實說,很惱人。

這個 bug (1886)已經兩年多了,Google 看來沒打算解決。因此有很不爽,直接回復。

[!quote] I was referred here by GCP support - which we pay for - so it's extra frustrating to see that a repeatable issue affecting basic functionality is known but receiving no attention. GCP support also referred me to this likely related issue that has been open since 2022.]

該討論串提到解法有兩個

  1. 用 Firebase Console 的 Query Builder 窮舉測試,看是哪個 query 無法成功。
  2. 用 Firebase Admin SDK 測試 query,看錯誤訊息。

無論用哪個方式,跳出的錯誤都會給你一個用來建立 index 的連結,點擊即可。