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
相关产品推荐
相关产品推荐

