如何确保在文件系统终止写入流之后出现 Express 响应?

Posted

技术标签:

【中文标题】如何确保在文件系统终止写入流之后出现 Express 响应?【英文标题】:How to assure that the Express response comes after the File System terminates the write stream? 【发布时间】:2019-09-03 13:37:06 【问题描述】:

在 Express.js API 中,我正在创建一个 zip 文件,该文件存储了一系列旨在作为下载传递的 PDF

我在README文件之后使用yazl包创建了zipfile,它非常好,当我使用管道创建createWriteStream时出现问题,因为我不知道如何正确地等待完成。

然后在我的 Express 路由中我想发送文件,但是这段代码是在写流完成之前执行的......

这是我的 repository.js 文件中名为 renderReports 的 Promise 函数的一段代码,在我编写 PDF 文件后,我使用循环添加到yazl 的 zipFile,然后我继续使用 fs.createWriteStream 创建 zip

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();

下面的代码是我如何使用promise的

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

我希望有人能解释一下如何解决这个问题

【问题讨论】:

或许你可以使用async/await。 其实我试过promisfying writeStream,但我没有成功我不知道为什么......因为那时Postman无法在服务器上得到响应,所以如果你可以发布一些代码来弄清楚如何解决这个问题,会很好 【参考方案1】:

您需要将写入流存储在一个变量中,以便您可以访问它。然后,在这个变量上,等待流的完成事件。一旦流完成写入,这将由 Node.js 发出。

【讨论】:

我不想打扰你,但如果你能放一些代码会很好,我试着按照你向我解释的方式去做,但后来我在服务器上没有得到任何响应邮递员

以上是关于如何确保在文件系统终止写入流之后出现 Express 响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何从流中读取 CSV 文件并在写入时处理每一行?

我的电脑出现系统处理程序C:\windows\system32\services.exe意外终止,状态码

如何确保在完成写入文件之前不读取文件

如何确保文件在复制前完成?

java中可以允许多个流同时对文件进行操作吗?我有段代码出现问题,就是同时对一个文件建立读取流和写入流

如何将 BIM 360 文件的内容作为文件流读取并将其写入另一个流