Я использую 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 \n" +
createdGTEDate + ", " + createdLTEDate + ", " + pendingCharges.length + " \n";
writeStream.write(writeData);
writeStream.close();
}
Примечания к коду: - Использование Underscore.js для функции uniq ().
Функция getData()
занимает некоторое времячтобы завершить выполнение, так как нужно разбить на страницы много данных, и каждый раз, когда отправляется соответствующая HTML-форма, пост-вызов вызывает немедленное выполнение res.download()
и попытку загрузки файла, прежде чем getData()
даже завершит получениеdata.
Любые идеи о том, какие были бы хорошие способы обеспечить загрузку, обработку и запись всех данных в файл до того, как res.download()
действительно вызоветФайл для загрузки?
РЕДАКТИРОВАТЬ: Добавлены недостающие биты кода выше.Спасибо всем!