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

Node中使用archiver压缩目录无任何反应的问题解决求助

问题排查与解决方案

核心问题定位

当前代码存在3个直接导致无响应的典型问题:

  • 输出文件嵌套在待打包源目录内,引发循环写入
  • 流错误监听不全,异常被静默吞掉
  • Node14环境下顶层await未做兼容,代码未正常执行

分步修复

1. 调整输出路径,避免循环扫描

你当前将压缩包输出到./work/folderName.zip,而待打包源目录正好是./work,archiver扫描源目录文件时会读到正在写入的压缩包本身,导致无限追加写入,程序卡住无响应。将输出路径调整到源目录外即可,比如改为./folderName.zip。

2. 补全错误监听,排查异常

当前只监听了archiver实例的错误,未监听写入流的异常,比如目录不存在、无写入权限、路径非法等错误都会被静默吞掉,看不到报错信息,修复后代码如下:

import { createWriteStream } from 'fs';
import archiver from 'archiver';

// 函数定义提前,避免作用域提升问题
const zipDirectory = async (source: string, out: string): Promise<void> => {
  const archive = archiver('zip', { zlib: { level: 9 }});

  return new Promise((resolve, reject) => {
    const stream = createWriteStream(out);
    // 补全写入流的错误监听
    stream.on('error', err => reject(err));
    stream.on('close', () => resolve());

    archive
      .directory(source, false)
      .on('error', err => reject(err))
      // 可加进度日志排查是否正常运行
      .on('progress', (progress) => console.log(`已处理${progress.entries.processed}个文件`))
      .pipe(stream);

    archive.finalize();
  });
}

// Node14 CommonJS模式不支持顶层await,用自执行async函数包裹
(async () => {
  try {
    // 输出路径改为源目录外
    await zipDirectory('./work', './folderName.zip');
    console.log('压缩完成');
  } catch (err) {
    // 全局捕获异常
    console.error('压缩失败:', err);
  }
})()

3. 兼容顶层await执行

如果一定要用顶层await,需要在package.json中添加"type": "module"配置开启ES模块模式,同时调整Babel、TS的模块输出配置适配ESM规范。

额外验证步骤

  • 先确认./work目录存在,且当前运行程序的用户对该目录有读取权限,对输出路径有写入权限
  • 测试时先用小体积的目录验证,避免大文件压缩等待时间过长误以为无响应
  • 检查编译后的JS代码是否符合Node14的语法支持,避免Babel转译产生未兼容的语法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:15:04