J'ai pris l'un des exemples de fonctions de la documentation Firestore et j'ai réussi à l'exécuter à partir de mon environnement Firebase local. Cependant, une fois que j'ai déployé sur mon serveur Firebase, la fonction se termine, mais aucune entrée n'est effectuée dans la base de données Firestore. Les journaux de la fonction Firebase affichent "Délai dépassé". Je suis un peu déconcerté. Quelqu'un sait pourquoi cela se produit et comment résoudre ce problème?
Voici l'exemple de fonction:
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();
});
Firestore a des limites.
Le "délai dépassé" se produit probablement en raison de ses limites.
Regarde ça. https://firebase.google.com/docs/firestore/quotas
Taux d'écriture maximum sur un document 1 par seconde
https://groups.google.com/forum/#!msg/google-cloud-firestore-discuss/tGaZpTWQ7tQ/NdaDGRAzBgAJ
J'ai écrit ce petit script qui utilise des écritures par lots (max 500) et n'écris qu'un lot après l'autre.
utilisez-le en créant d'abord un batchWorker let batch: any = new FbBatchWorker(db);
Ajoutez ensuite n'importe quoi à l'ouvrier batch.set(ref.doc(docId), MyObject);
. Et terminez-le via batch.commit()
. L'API est la même que pour le lot Firestore normal ( https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes ) Cependant, il ne prend actuellement en charge que 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);
}
}
D'après ma propre expérience, ce problème peut également se produire lorsque vous essayez d'écrire des documents en utilisant une mauvaise connexion Internet.
J'utilise une solution similaire à la suggestion de Jurgen d'insérer des documents en lot inférieur à 500 à la fois, et cette erreur apparaît si j'utilise une connexion wifi pas si stable. Lorsque je branche le câble, le même script avec les mêmes données s'exécute sans erreur.
Si l'erreur est générée après environ 10 secondes, ce n'est probablement pas votre connexion Internet, il se peut que vos fonctions ne retournent aucune promesse. D'après mon expérience, j'ai eu l'erreur simplement parce que j'avais enveloppé une opération de définition de base de feu (qui renvoie une promesse) dans une autre promesse. Tu peux le faire
return db.collection("COL_NAME").doc("DOC_NAME").set(attribs).then(ref => {
var SuccessResponse = {
"code": "200"
}
var resp = JSON.stringify(SuccessResponse);
return resp;
}).catch(err => {
console.log('Quiz Error OCCURED ', err);
var FailureResponse = {
"code": "400",
}
var resp = JSON.stringify(FailureResponse);
return resp;
});
au lieu de
return new Promise((resolve,reject)=>{
db.collection("COL_NAME").doc("DOC_NAME").set(attribs).then(ref => {
var SuccessResponse = {
"code": "200"
}
var resp = JSON.stringify(SuccessResponse);
return resp;
}).catch(err => {
console.log('Quiz Error OCCURED ', err);
var FailureResponse = {
"code": "400",
}
var resp = JSON.stringify(FailureResponse);
return resp;
});
});