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); 
    } 

}