Я пишу облачную функцию, которая читает несколько строк из CSV-файла и отправляет один HTTP-запрос для каждой строки, но я получаю сообщение об ошибке выше.
Эта ошибка уже задавалась ранее ( здесь , здесь и здесь , чтобы перечислить несколько), но во всех этих случаях проблема заключалась в том, что функция не возвращала обещание, которое разрешалось бы только после каждой асинхронной операции.
Из моего понимания того, как работает async
, мой код, похоже, не имеет этой проблемы. Вот суть этого, удалив некоторые конкретные детали:
const request = require('request-promise-native');
const storage = require('@google-cloud/storage')();
exports.sendData = async (data, context) => {
const [file] = await storage.bucket(data.bucket).file(data.name).download();
const [header, ...table] = file.toString('utf8').split('\n').map(row => row.split(','));
const rows = table.map(
row => header.reduce((obj, col, i) => {
obj[col] = row[i];
return obj;
}, {})
);
const paramList = rows.map(({csv_field1, csv_field2}) => ({
req_field1: csv_field1,
req_field2: csv_field2,
// etc.
}));
let errors = 0;
console.log(`Sending ${paramList.length} rows...`);
await Promise.all(paramList.map(async (param, i) => {
try {
await request.get({url: "", qs : param}); // Endpoint removed
if ((i + 1) % 10000 == 0) {
console.log(`${i+1} rows ${paramList.length} sent.`);
}
} catch (e) {
console.log(`Request failed for row ${i+1} .\n\n${e}`);
errors++;
}
}));
console.log(`Done.`);
if (errors > 0) {
console.log(`Total errors: ${errors}`);
}
};
Приведенный выше код прекрасно работает для пары строк (10), но ошибка начинает появляться при попытке увеличить число (1000). «Готово». сообщение также не появилось в журналах, поэтому не похоже, что функция подходит к концу.
Есть какие-нибудь подсказки?