簡體   English   中英

Firestore REST API,POST 請求成功,文檔未出現在模擬器 UI 中,雲觸發器未觸發

[英]Firestore REST API, POST request succeeds, document does not appear in emulator UI, and cloud triggers do not fire

自上周以來,我一直在使用 Firestore 遇到問題。

問題:未從 REST API 寫入 Firestore 數據庫。

  • 在模擬器和生產環境中都觀察到了這種行為。
  • 使用模擬器運行單元測試時不會出現此問題,寫入按預期進行並且數據庫已成功導出。
  • 運行模擬器時。
    • 通過 REST API 的 GET 請求將返回成功,並返回預期的文檔。
    • 通過 REST API (createDocument) 的 POST 請求將成功返回,並返回預期的文檔,但該文檔不會出現在模擬器 UI 中。
    • 為了響應此路徑上的 createDocument,Firestore 雲觸發器不會觸發,這將在文檔創建后將其刪除。
    • 如果再次發出相同的 POST 請求,它將失敗並顯示代碼 409,並顯示消息:“實體已存在:<path_to_document>”。 但同樣,它沒有出現在模擬器 UI 中。
    • 退出時,模擬器導出的數據庫將不包含來自 POST 請求的文檔。
    • 重新啟動模擬器將允許 POST 請求成功發出,但如上文檔不會出現在模擬器 UI 中,雲觸發器不會觸發,后續請求也會失敗。
  • 我在嘗試部署到生產環境后第一次觀察到這個問題,但收到了一個錯誤(不記得錯誤,我沒有保存日志,抱歉。),我認為問題是由於節點包過時造成的,所以我更新了 firebase-tools 和 node 包。 但問題仍然存在。
  • 幾個月來,寫入一直在按預期工作,這個問題是最近的。

發布示例:

curl --request POST \
  'http://127.0.0.1:8080/v1/projects/demo-<PROJECT_ID>/databases/(default)/documents/HOME?documentId=11223344&key=<API_KEY>' \
  --header 'Authorization: Bearer <TOKEN>' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{ "fields":{ "my_field":{ "stringValue":"random" }} }' \
  --compressed

**注意:PROJECT_ID、API_KEY 和 TOKEN 具有正確的值,我只是為這篇文章刪除了它們。

  • 我用最少的代碼在一個全新的獨立 firebase 項目中重新創建了該行為。
  • 將 Firestore 規則設置為允許所有讀取和寫入,仍然會產生相同的行為。
  • 我嘗試使用舊版本的 firebase-tools 和節點包,但沒有成功。
  • 我還刪除並重新安裝了最新版本的 Java (v18)。

Firestore 規則和 index.js 下面的任何幫助將不勝感激!

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true
    }
  }
}
const functions = require( "firebase-functions" );
exports.userPath = functions
  .firestore.document( "{root}/{node}" )
  .onCreate( async( snap, context ) => {
    try
    {
      console.log( "Document @ path: "+snap.ref.path );
        await sleep( 250 );
        await snap.ref.delete();
      return console.log( "Document deleted @ path: "+snap.ref.path );
    }
    catch( error )
        { return await console.log( "FATAL error" ); }
});

Cloud Firestore 模擬器嘗試忠實地復制生產服務的行為,但有一些明顯的限制,例如在事務方面,例如,當您測試涉及多個並發寫入一個文檔的功能時,模擬器在某些情況下完成寫入請求可能會很慢在這種情況下,鎖可能需要 30 秒才能釋放。 如果需要,建議考慮相應地調整測試超時。

在典型的生命周期中,Cloud Firestore function 執行以下操作:

  1. 等待對特定文檔的更改。
  2. 當事件發生並執行其任務時觸發。
  3. 接收數據 object,其中包含存儲在指定文檔中的數據的快照。 對於 onWrite 或 onUpdate 事件,數據 object 包含兩個快照,分別代表觸發事件之前和之后的數據 state。

您可能需要檢查並確認文檔路徑不得包含尾部斜杠。
您共享的代碼使用 onCreate 方法,該方法僅響應文檔創建。對於指向不存在文檔的 DocumentSnapshot,任何數據訪問都將返回“未定義”。 您可以使用exists屬性來顯式驗證文檔的存在。
對不存在的文檔的刪除被視為成功(除非提供了 lastUptimeTime)。

        (snapshot: QueryDocumentSnapshot, context: EventContext) => any)
       : CloudFunction<QueryDocumentSnapshot>

請查看有用的文檔以獲取有關能夠測試跨產品交互Firestore DocumentSnapshot使用的模擬器的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM