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

NodeJS出现MaxListenersExceededWarning,请求排查帮助

问题分析与解决

警告原因

你遇到的MaxListenersExceededWarning是因为把多个读取流同时绑定到了同一个zlib.createGzip()流和写入流。每个pipe()操作都会给目标流(这里是zip和zipWriteStream)添加多个事件监听器(比如data、end、error等),当htmlFiles数量超过10个时,监听器总数就会超过Node.js EventEmitter的默认阈值,触发内存泄漏警告。

更关键的是:你的写法根本无法生成包含多个HTML文件的有效zip包。zlib.createGzip()只能压缩单个数据流,不能处理多文件归档——多个文件同时往同一个gzip流里写,最终的压缩包会是一堆混乱的拼接数据,根本无法正常解压出多个独立文件。

正确解决方案

要打包多个文件成zip包,应该用专门的归档库,比如archiver(Node.js生态最常用的归档工具)。

步骤1:安装依赖

npm install archiver

步骤2:修正代码

const fs = require('fs');
const archiver = require('archiver');

function zipUpFile() {
  const folderPath = "./dist";
  const output = fs.createWriteStream("signature-templates.zip");
  const archive = archiver('zip', {
    zlib: { level: 9 } // 压缩级别,可选
  });

  // 监听归档过程的错误
  archive.on('error', function(err) {
    throw err;
  });

  // 将归档流管道到写入流
  archive.pipe(output);

  fs.readdir(folderPath, (error, files) => {
    if (error) {
      console.error(error);
      return;
    }

    const htmlFiles = files.filter((file) => file.endsWith(".html"));

    // 逐个添加文件到归档包
    htmlFiles.forEach((htmlFile) => {
      const filePath = `${folderPath}/${htmlFile}`;
      // 添加文件到zip,第二个参数是文件在zip里的路径/名称
      archive.file(filePath, { name: htmlFile });
    });

    // 完成归档,结束流
    archive.finalize();
  });
}

补充说明

  • archiver会自动处理多文件的归档结构,确保每个文件在zip包里独立存在,不会出现数据混乱。
  • 这种写法只会建立必要的事件监听器,不会触发监听器数量超限的警告。
  • 如果坚持要用原生API实现(不依赖第三方库),需要手动构建zip文件的归档格式(包括文件头、目录结构等),这会非常繁琐,不推荐新手尝试。

内容的提问来源于stack exchange,提问作者RenaissanceMan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:40:20