簡體   English   中英

使用 Firestore 模擬器時無法從客戶端應用寫入 Firestore

[英]Cannot write to Firestore from client app when using Firestore Emulator

我在使用 Firestore 模擬器時在 Firestore 中創建文檔時遇到問題。 以下是我在日志中看到的錯誤:

W/Firestore(13200): (24.0.1) [WriteStream]: (aa74142) Stream 關閉狀態:Status{code=UNKNOWN, description=null, cause=null}。

在我的應用程序中,用戶注冊后,我檢查是否有與該用戶相關的文檔。 此讀取操作成功,因此我得出結論,我可以從 Firestore 讀取。 如果沒有與用戶相關的文檔,則會創建一個文檔。 這就是代碼卡住的地方。 寫操作不返回。 它也不會拋出異常。

我同時使用身份驗證和 Firestore 模擬器。

此問題不會一直發生。 例如,在應用程序中,當生成新的 FCM 令牌時,該令牌將保存到 Firestore 中,並且可以正常工作。 我可以在 Firestore 模擬器儀表板中看到該文檔。 我還可以使用儀表板手動創建文檔。

該問題同時出現在物理設備和 Android 模擬器上。 在物理設備上進行測試時,我通過指定運行 Firestore 模擬器的計算機的 IP 地址連接到 Firestore 模擬器。 在 Android 模擬器上,我提供localhost作為 Firestore 模擬器的主機。

我還在 flutterfire 存儲庫中創建了一個問題

Output flutter doctor

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.10.1, on Pop!_OS 21.10 5.15.23-76051523-generic, locale en_US.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0-rc1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.1)
[✓] VS Code (version 1.64.2)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

• No issues found!

cloud_firestorefirebase_core包的版本:

cloud_firestore: ^3.1.8
firebase_core: ^1.12.0

我的模擬器套件問題是卡巴斯基防病毒軟件。 禁用它后,一切正常。 也許這對你有幫助!

這也發生在我身上,以前從未有過。 我遇到的錯誤是,當我使用 Android 模擬器創建文檔時,我無法從任何其他來源寫入文檔。 因此,例如,在測試時,我將在 Android 模擬器、Firefox 和 web 的 Android 手機的應用程序中使用單獨的帳戶。 如果我嘗試寫入的文檔是由模擬器創建的,則我無法通過手機或計算機瀏覽器上的 web 寫入。 如果我改用 Chrome 模擬器,一切正常。 如果我最初在手機或瀏覽器上創建文檔,然后從 android 手機的 android 模擬器/web/web 寫入它,它也可以正常工作。 顯然很難調試,因為它只會在從 Android 模擬器創建初始文檔時發生。

編輯:將調試器連接到 Chrome,然后在 Android 模擬器中創建 raid 文檔后,我能夠解決我的問題。 我相信 Android 模擬器處理時間戳的方式最近發生了變化,這導致了我的錯誤。

這是 Firebase 模擬器使用 Timestamp.fromDate(DateTime.now()); 時存儲在 Firebase 中的時間戳:Timestamp(seconds=1646095038, nanoseconds=780498000)

在 Chrome 中,相同的命令如下所示:Timestamp(seconds=1646095976, nanoseconds=800000000) Chrome

上周發生的事情是,當在 Android 模擬器中創建時間戳時,這段旨在在我的 MMORPG 應用程序中獲取最新 raid 文檔的代碼無法從 firebase 在 web 上獲得結果:

   //update most recent raid doc
  Future<void> updateRaid(String guildName, Raid raid) async {
    var snap = await _db
        .collection('guilds')
        .doc(guildName)
        .collection('raids')
        .where('raidDocCreated', isEqualTo: raid.raidDocCreated)
        .get();
    var docId = snap.docs[0].id;
    return _db
        .collection('guilds')
        .doc(guildName)
        .collection('raids')
        .doc(docId)
        .set(raid.toJson());
  }

底線是,如果您正在做與此類似的事情,您正在嘗試查詢 Android 模擬器存儲的 firebase 中的時間戳,則 web 將無法准確比較相等性。 我能夠通過在數據庫中存儲一個 int 來解決這個問題,而不是使用 DateTime.now().millisecondsSinceEpoch 的時間戳來查詢最近創建的文檔。 現在,當我的文檔在 Android 模擬器上創建時,web 可以正確比較 raidDocCreatedAt 變量的相等性。

我遇到的問題已經解決。 我不知道這背后的變化是什么,但我記得在我運行 Firebase 模擬器的環境中進行了幾次升級。 它也可能是更改節點的版本或升級 Firebase Admin SDK。

暫無
暫無

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

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