如何在Node.js中await等待fs.WriteStream关闭?
解决方案
单文件写入等待
你可以把WriteStream的close和error事件包装成Promise,用await等待写入完成。同时注意调整代码顺序:先将PDF文档pipe到写入流,再填充内容并结束文档,确保所有内容能正确流入文件。
修改后的代码如下:
import fs from 'fs'; import PDFDocument from 'pdfkit'; // 封装流关闭的Promise工具函数 function waitForStreamClose(stream) { return new Promise((resolve, reject) => { stream.on('close', resolve); stream.on('error', err => reject(new Error(`写入文件失败: ${err.message}`))); }); } export default async function generate_pdf(params, filePath) { let doc = new PDFDocument({ size: "A4", margin: 50 }); // 先pipe到写入流,再处理内容 const writeStream = doc.pipe(fs.createWriteStream(filePath)); // 填充PDF文档内容 fillDoc(doc); // 结束文档 doc.end(); // 等待写入流关闭 await waitForStreamClose(writeStream); return filePath; }
多文件批量生成
如果需要同时生成多个PDF文件,用Promise.all等待所有生成任务完成即可:
// 示例:批量生成3个PDF async function batchGeneratePDFs() { const tasks = [ generate_pdf(params1, './file1.pdf'), generate_pdf(params2, './file2.pdf'), generate_pdf(params3, './file3.pdf') ]; // 等待所有文件写入完成 const resultPaths = await Promise.all(tasks); console.log('所有PDF生成完成:', resultPaths); }
关键说明
- 事件监听:通过监听流的
close事件确认写入完成,同时监听error事件捕获写入异常,避免静默失败。 - 顺序调整:先执行
doc.pipe()再填充内容和调用doc.end(),确保PDF生成的所有数据都能正确流入写入流,不会丢失内容。 - 批量处理:
Promise.all会等待所有传入的Promise都resolve后才返回,天然支持多文件的并行生成与等待。
内容的提问来源于stack exchange,提问作者Lockface77
相关产品推荐
相关产品推荐

