Скорее всего, это потому, что в Array.from(parsXml.Records.Clientes.Cliente).forEach()
l oop вы выполняете несколько асинхронных set()
операций, но возвращаете ответ (response.send("Received.");
) до того, как эти асинхронные операции будут выполнены .
Делая response.send("Received.");
, вы указываете экземпляру, выполняющему вашу облачную функцию, что он может прекратить ее, но в большинстве случаев асинхронная запись в Firestore не завершена.
Вам необходимо правильно обрабатывать обещания, возвращаемые вызовами метода set()
, следующим образом (не проверено):
//....
const promises = [];
Array.from(parsXml.Records.Clientes.Cliente).forEach(cli => {
if (cli !== null) {
delete cli.$;
const docRef = clientes.doc(cli.CliCodigo);
promises.push(docRef.set(cli));
}
});
await Promise.all(promises);
response.send("Received.");
//....
Итак, мы используем Promise.all()
для параллельного выполнения всех методов set()
звонки. Метод Promise.all()
возвращает single Promise, которое выполняется, когда все обещания, переданные в качестве итерируемого (то есть массива promises
), были выполнены. Поэтому вы уверены, что вся асинхронная работа выполняется при отправке ответа, указывающего платформе облачных функций, что он может безопасно завершить вашу облачную функцию.