Этот код выполняется либо один раз, либо максимум 100 раз. У меня есть фиктивный файл данных с 6000 записями, так как это среднее значение, которое ему придется обрабатывать.
В настоящее время использую план Blaze.
Код немного работал, я создал новый проект, и теперь у меня возникла эта проблема.
export const uploadPatrons = functions.storage
.object()
.onFinalize((object, context) => {
let patronPromise: any[];
patronPromise = [];
if (object.name === 'patrons/upload.csv') {
admin
.storage()
.bucket()
.file('/patrons/upload.csv')
.download({})
.then(data => {
Papa.parse(data.toString(), {
header: true,
skipEmptyLines: true,
complete: result => {
result.data.forEach(x => {
x.inside = false;
x.arrived = false;
x.img = false;
x.arrivedTime = null;
const newPromise = admin
.firestore()
.collection('patrons')
.add({ ...x })
.then(doc => {
console.info(doc);
})
.catch(err => {
console.info(err);
});
patronPromise.push(newPromise);
});
}
});
})
.catch(err => {
console.info(err);
});
}
return Promise.all(patronPromise)
.catch(err => {
console.info(err);
});
});
Все, что ему нужно сделать, это прочитать файл из хранилища, проанализировать его и добавить каждую запись в коллекцию firebase.
Function returned undefined, expected Promise or value
Это ошибка, которую я получаю в журналах





Вы игнорируете обещание, что admin.storage().bucket().file('/patrons/upload.csv').download({}) возвращает, что означает, что функция может быть прервана.
Я думаю, что это должно быть ближе к этому:
export const uploadPatrons = functions.storage
.object()
.onFinalize((object, context) => {
let patronPromise: any[];
patronPromise = [];
if (object.name === 'patrons/upload.csv') {
return admin.storage().bucket()
.file('/patrons/upload.csv')
.download({})
.then(data => {
Papa.parse(data.toString(), {
header: true,
skipEmptyLines: true,
complete: result => {
result.data.forEach(x => {
x.inside = false;
x.arrived = false;
x.img = false;
x.arrivedTime = null;
const newPromise = admin.firestore()
.collection('patrons')
.add({
...x
})
patronPromise.push(newPromise);
});
// TODO: return the Promise.all(patronPromise) here
}
});
})
}
});
Из-за вашего первого обещания может быть отключено, даже если оно не завершено. Так что старайтесь следовать правилу promise/always-return
export const uploadPatrons = functions.storage
.object()
.onFinalize((object, context) => {
if (object.name === 'patrons/upload.csv') {
return admin.storage().bucket()
.file('/patrons/upload.csv')
.download({})
.then(data => {
let patronPromise: any[];
patronPromise = [];
Papa.parse(data.toString(), {
header: true,
skipEmptyLines: true,
complete: result => {
result.data.forEach(x => {
x.inside = false;
x.arrived = false;
x.img = false;
x.arrivedTime = null;
const newPromise = admin.firestore()
.collection('patrons')
.add({
...x
})
patronPromise.push(newPromise);
});
}
});
return Promise.all(patronPromise)
})
.then(result=>{
//return Promise.resolve or something
})
.catch(err=>{
console.info(err)
})
}
else{
//also return if it's nothing
}
});
Спасибо, теперь моя единственная проблема заключается в том, что время ожидания истекает, когда нужно добавить много записей. Мой тестовый пример 6000. Но даже на 1000 он не работает, может сделать 100, а потом сбой.
Можете выложить скриншот ошибки?