You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:43:14