3

我從Firestore文檔中選取了一個示例函數,並且能夠從我的本地Firebase環境成功運行它。但是,一旦我部署到我的Firebase服務器,該功能就完成了,但是在Firestore數據庫中沒有任何條目。 Firebase功能日誌顯示「超出截止日期」。我有點困惑。任何人都知道爲什麼發生這種情況以及如何解決這個問題帶Firestore的Firebase Cloud功能返回「截止日期超時」

下面是示例功能:

exports.testingFunction = functions.https.onRequest((request, response) => { 
var data = { 
    name: 'Los Angeles', 
    state: 'CA', 
    country: 'USA' 
}; 

// Add a new document in collection "cities" with ID 'DC' 
var db = admin.firestore(); 
var setDoc = db.collection('cities').doc('LA').set(data); 

response.status(200).send(); 
}); 
+2

不確定它是否與您看到的錯誤有關,但您可能想等待'doc(...).set(data)'返回的許諾來解決,使用'return db .collection('cities').doc('LA').set(data).then(result => response.status(200))' – Ramon

+0

@Ramon將它更改爲承諾並從日誌中刪除錯誤,但不幸的是沒有成功將數據插入到收藏中。 –

回答

2

具有的FireStore限制。

可能由於其限制而發生「截止日期超時」。

看到這個。 https://firebase.google.com/docs/firestore/quotas

最大寫入速率文檔每秒1

https://groups.google.com/forum/#!msg/google-cloud-firestore-discuss/tGaZpTWQ7tQ/NdaDGRAzBgAJ

+0

有關於此的任何解決方法建議?我想在使用節點進行處理時進行1500000數據的初始數據導入。任何建議表示讚賞。 –

+0

@KD。每秒1個限制是針對一個文件。對於數據庫,限制爲「每個數據庫每秒的最大寫入數| 2,500(最高每秒2.5 MiB)」。雖然需要時間,但可以使用setTimeout避免此限制。 –

+0

謝謝。添加超時將是我最後的選擇,因爲我有太多的初始輸入數據。我真的希望有一種方法可以像實時數據庫一樣導入JSON。現在我正在使用實時分貝,因爲相同的方法可以很好地處理它。 –

0

我寫它採用成批寫操作(最大500)和只寫一個接一個批處理這個腳本。

通過首先創建一個批處理程序let batch: any = new FbBatchWorker(db); 使用它然後向工作人員batch.set(ref.doc(docId), MyObject);添加任何東西。並通過batch.commit()完成它。 api與普通Firestore批處理(https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes)相同,但目前僅支持set

import {firestore} from "firebase-admin"; 


export default class FbBatchWorker { 

    db: firestore.Firestore; 
    batchList: FirebaseFirestore.WriteBatch[] = []; 
    elemCount: number = 0; 

    constructor(db: firestore.Firestore) { 
     this.db = db; 
     this.batchList.push(this.db.batch()); 
    } 

    async commit(): Promise<any> { 
     let batchProms: Promise<any>[] = []; 

     for (let _batch of this.batchList) { 
      (await _batch.commit()); 
      console.log("finished writing batch"); 
      // batchProms.push(_batch.commit()); 
     } 

     // return Promise.all(batchProms); 
     return Promise.resolve("yeah"); 
    } 

    set(dbref: FirebaseFirestore.DocumentReference, data: any): void { 
     this.elemCount = this.elemCount + 1; 
     if (this.elemCount % 490 === 0) { 
      this.batchList.push(this.db.batch()); 
     } 
     this.batchList[this.batchList.length - 1].set(dbref, data); 
    } 

}