В API Express.js я создаю zip-файл, в котором хранится коллекция PDF-файлов, предназначенных для передачи в виде загрузки
. Я создал zip-файл, используя yazl пакет, следующий за файлом README, и это довольно хорошо, проблема возникает, когда я использую канал для создания createWriteStream , потому что я не знаю, как правильно ждать, пока не закончится.
Затем в моем экспресс-маршруте я хочу отправить файл, но этот код выполняется до завершения потока записи ...
Это фрагмент кода функции Promise с именем renderReports внутри моего repository.js , после того, как я пишу файл PDF, я использую цикл для добавления в zipFile yazl, затем я продолжаю создавать zip с fs.createWriteStream
const renderFilePromises = renderResults.map((renderedResult, index) =>
writeFile(`./temporal/validatedPdfs/${invoices[index].id}.pdf`, renderedResult.content)
);
await Promise.all(renderFilePromises);
const zipfile = new yazl.ZipFile();
invoices.map((invoice, index) => {
zipfile.addFile(`./temporal/validatedPdfs/${invoice.id}.pdf`, `${invoice.id}.pdf`)
});
zipfile.outputStream.pipe(fs.createWriteStream("./temporal/output.zip").on('close', () => {
console.log('...Done');
}));
zipfile.end();
resolve();
И следующий код - это то, как я использую обещание
app.post('/pdf-report', async (req, res, next) => {
const { invoices } = req.body;
repository.renderReports(reporter, invoices)
.then(() => {
res.sendFile('output.zip', {
root: path.resolve(__dirname, './../../temporal/'),
dotfiles: 'deny',
}, (err) => {
if (err) {
console.log(err);
res.status(err.status).end();
}
else {
console.log('Sent:', 'output.zip');
}
});
})
.catch((renderErr) => {
console.error(renderErr);
res.header('Content-Type', 'application/json');
return res.status(501).send(renderErr.message);
});
});
Я надеюсь, что кто-то может объяснить, как подойти к этому