0

我正在尝试按照此处的建议使用node-archiver压缩目录的内容。该函数在 Node.js 运行时环境中的 AWS Lambda 中运行。

我的功能如下:

function zipDirectory(source, outputTarget) {
    var archive = archiver("zip");
    const stream = fs.createWriteStream(outputTarget, { flags: 'w' });

    stream.on("close", () => {
        console.log(archive.pointer() + ' total bytes');
        console.log('archiver has been finalized and the output file descriptor has closed.');
    });

    return new Promise((resolve, reject) => {
        archive.pipe(stream);
        archive.on("error", err => reject(err))
        archive.directory(source, false);
        archive.finalize();
        stream.close();
        resolve();
    });
}

结果是创建了 zip,但文件大小为零:

INFO    0 total bytes
INFO    archiver has been finalized and the output file descriptor has closed.

我也无法提取存档并出现以下错误。

INFO    Error: end of central directory record signature not found

笔记:

  1. 源目录肯定存在,已填充,并且路径正确。
  2. 一切都被写入/tmp/AWS Lambda 允许我们读写访问的目录。
  3. 我尝试使用 Lambda 部署包上传zip二进制文件并将其作为子进程运行,但显然不支持,因为它是 32 位包。如果您有替代方案,我可以使用它来压缩节点外部的目录,这些目录可以在 Lambda 的运行时工作,请告诉我。

感谢任何帮助,谢谢!

4

1 回答 1

0

好吧,想通了我的错误。

  1. archive.finalize()返回一个承诺,并且该函数在归档完成之前返回。
  2. 调用对您stream.close()来说是不必要的archive.finalize(),因此无论归档是否完成,流都会被关闭。

正确的代码如下所示:

function zipDirectory(source, outputTarget) {
    var archive = archiver("zip");
    const stream = fs.createWriteStream(outputTarget, { flags: 'w' });

    stream.on("close", () => {
        console.log(archive.pointer() + ' total bytes');
        console.log('archiver has been finalized and the output file descriptor has closed.');
    });

    return new Promise(async (resolve, reject) => {
        archive.pipe(stream);
        archive.on("error", err => reject(err))
        archive.directory(source, false);
        await archive.finalize();
        resolve();
    });
}
于 2020-10-02T21:09:44.943 回答