NodeJS js:等待生成zip文件并发送响应

tcomlyy6  于 2023-08-04  发布在  Node.js
关注(0)|答案(2)|浏览(130)

我正在使用模块archiver生成一个zip文件。我想等待zip文件生成后再继续。下面是代码的相关部分。

// create a file to stream archive data to.
const archiver = require('archiver');
const fs =  require('fs');

async function zipcsv(zipPath) {
  let output = fs.createWriteStream(zipPath);
  let archive = archiver('zip', {
    zlib: { level: 9 } // Sets the compression level.
  });
  output.on('close', function() {
   return 'zip generating complete';
  });
  archive.pipe(output);
  archive.directory('exports/', false);
  archive.finalize();
}

module.exports.zipcsv = zipcsv;

个字符
我在控制台上看到了进一步的处理,该进程没有等待zip生成并继续。
如何确保zip生成后继续进行进一步的处理?

  • 谢谢-谢谢
h79rfbju

h79rfbju1#

archive.finalize()意味着zip文件中的子文件的追加已完成,但它并不意味着写入流已完成。在node-archiver库的README代码指针中也提到了这一点。
还有一个issue围绕这一点,但我没有看到任何行动项目正在采取这一点。
有两种方法可以解决这个问题:
1.使用回调方法等待写入流完成。

// set a variable to track completion
let isComplete = false; 

// set this variable to true in the callback methods 
output.on('close', function() {
  isComplete = true;
});

archive.finalize();

// after finalize() wait till isComplete is not set to true
while (!isComplete) {
  console.log("waiting...");
  await new Promise((resolve) => {
    setTimeout(resolve, 100);
  });
}

字符串
1.您可以使用adm-zip,它允许您直接在磁盘或内存缓冲区中处理zip文件。与node-archiver库相比,它的使用也更简单。
Sample usage

// creating archives
var zip = new AdmZip();

// add file directly
var content = "inner content of the file";
zip.addFile("test.txt", Buffer.from(content, "utf8"), "entry comment goes here");
// add local file
zip.addLocalFile("/home/me/some_picture.png");
// get everything as a buffer
var willSendthis = zip.toBuffer();
// or write everything to disk
zip.writeZip(/*target file name*/ "/home/me/files.zip");

vsnjm48y

vsnjm48y2#

你需要在async函数中使用一个Promise函数。然后使用resolve和reject代替return。

相关问题