Я использую Express.js и HTML для этого проекта о получении данных, их обработке и записи в файл, который загружается сразу после нажатия кнопки отправки в форме HTML.
res.download()
в ходе почтового вызова выполняется и пытается загрузить файл, который еще не был написан, и я пытаюсь выяснить, как я могу заставить res.download()
его выполнить после того, как данные были обработаны и записаны в файл.
Вот код:
let filtered = [], countEv = [];
let createdGTEDate = 0, createdLTEDate = 0;
app.post('/', (req, res) => {
getData();
res.download('./filename.txt');
}
getData() {
module.events.list(
{
limit: 100,
types: ["charges"],
created: {gte: createdGTEDate, lt: createdLTEDate}
},
function (err, events) {
if(events !== null) {
for (let i = 0; i < events.data.length; i++) {
countEv.push(events.data[i]);
}
if (events.has_more) {
recurringPaginate(events["data"][events["data"].length - 1].id);
}
}
});
function recurringPaginate(starting_after) {
module.events.list(
{
limit: 100,
created: {gte: createdGTEDate, lt: createdLTEDate},
types: ["charge.succeeded", "charge.failed"],
starting_after: starting_after
},
function (err, events) {
for (let i = 0; i < events.data.length; i++) {
countEv.push(events.data[i]);
}
if (events.has_more) {
recurringPaginate(events["data"][events["data"].length - 1].id);
}
if(events.has_more === false) {
filterCharges();
}
});
}
}
function filterCharges() {
uniqueCharges = _.uniq(countEv, function (u) {
return u.data.id;
});
pendingCharges = uniqueCharges.filter(function (obj) {
return obj.data.type === "pending";
});
writeCSV();
}
function writeCSV() {
let writeStream = fs.createWriteStream("Report.csv");
let writeData = "Start Date, End Date, Pending Charge Count
" +
createdGTEDate + ", " + createdLTEDate + ", " + pendingCharges.length + "
";
writeStream.write(writeData);
writeStream.close();
}
Заметки о коде: - Использование Underscore.js для функции uniq ().
Для выполнения выполнения getData()
функции требуется некоторое время, так как она должна разбиваться на страницы с большим количеством данных, и каждый раз, когда соответствующая форма HTML отправляется, пост-вызов вызывает res.download()
немедленное выполнение и пытается загрузить файл, прежде чем getData()
он даже закончил получать данные ,
Любые идеи о том, что было бы хорошим способом гарантировать, что все данные были загружены, обработаны и записаны в файл до этого res.download()
, фактически заставляют файл загружаться?
EDIT: Добавлены недостающие фрагменты кода выше. Спасибо всем!