Как убедиться, что экспресс-ответ приходит после того, как файловая система завершает поток записи? - PullRequest
0 голосов
/ 12 апреля 2019

В 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);
  });
});

Я надеюсь, что кто-то может объяснить, как подойти к этому

1 Ответ

0 голосов
/ 12 апреля 2019

Вам необходимо сохранить поток записи в переменной, чтобы вы могли получить к ней доступ. Затем в этой переменной дождитесь окончания события потока. Это испускается Node.js, когда поток завершен с записью.

...