如何确保在文件系统终止写入流之后出现 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 响应?的主要内容,如果未能解决你的问题,请参考以下文章
我的电脑出现系统处理程序C:\windows\system32\services.exe意外终止,状态码