node.js-使用archiver归档文件夹生成空zip

node.js-使用archiver归档文件夹生成空zip,node.js,express,zip,Node.js,Express,Zip,我正在尝试使用存档文件夹,我要存档的文件夹的路径如下所示: Project | app.js | tmp | folderToArchive │file1.txt │file2.txt │file3.txt var archiver = require("archiver"); app.get("/download/:folder", (req, r

我正在尝试使用存档文件夹,我要存档的文件夹的路径如下所示:

Project
| app.js
| tmp
    |
     folderToArchive
            │file1.txt 
            │file2.txt 
            │file3.txt 
var archiver = require("archiver");

    app.get("/download/:folder", (req, res) => {
    
      var FolderName = req.params.folder;
      var zipName = FolderName + ".zip";
      var source = path.join(__dirname, "tmp", FolderName);
      var out = path.join(__dirname, "tmp", zipName);
    
    
      const archive = archiver('zip', { zlib: { level: 9 }});
      const stream = fs.createWriteStream(out);
    
      return new Promise((resolve, reject) => {
        archive
          .directory(source, false)
          .on('error', err => reject(err))
          .pipe(stream)
        ;
    
        stream.on('close', () => resolve());
        archive.finalize();
        console.log("zip file created");
      });
    
    });
生成zip文件的服务器端代码如下所示:

Project
| app.js
| tmp
    |
     folderToArchive
            │file1.txt 
            │file2.txt 
            │file3.txt 
var archiver = require("archiver");

    app.get("/download/:folder", (req, res) => {
    
      var FolderName = req.params.folder;
      var zipName = FolderName + ".zip";
      var source = path.join(__dirname, "tmp", FolderName);
      var out = path.join(__dirname, "tmp", zipName);
    
    
      const archive = archiver('zip', { zlib: { level: 9 }});
      const stream = fs.createWriteStream(out);
    
      return new Promise((resolve, reject) => {
        archive
          .directory(source, false)
          .on('error', err => reject(err))
          .pipe(stream)
        ;
    
        stream.on('close', () => resolve());
        archive.finalize();
        console.log("zip file created");
      });
    
    });
问题是当我运行应用程序时,它会在正确的目标位置创建一个空的zip文件

这对我来说是全新的,我想知道为什么zip文件是空的


“关于”

测试了以下代码,它可以正常工作:

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

const FolderName = "fol";
const zipName = FolderName + ".zip";
const source = path.join(__dirname, "tmp", FolderName);
const out = path.join(__dirname, "tmp", zipName);

const archive = archiver('zip', { zlib: { level: 9 }});
const stream = fs.createWriteStream(out);

archive
    .directory(source, false)
    .on('error', err => {throw err;})
    .pipe(stream);

stream.on('close', () => console.log("closed"));
archive.finalize();
console.log("zip file created");
因此,我建议:

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

const archive = (folderName) => {
    const zipName = folderName + ".zip";
    const source = path.join(__dirname, "tmp", folderName);
    const out = path.join(__dirname, "tmp", zipName);

    const archive = archiver('zip', { zlib: { level: 9 }});
    const stream = fs.createWriteStream(out);

    archive
        .directory(source, false)
        .on('error', err => {throw err;})
        .pipe(stream);

    stream.on('close', () => console.log("closed"));
    archive.finalize();
    console.log("zip file created");
};

app.get("/download/:folder", (req, res) => {
    const folderName = req.params.folder;
    archive(folderName);
});

这可能与我有一个空存档的原因相同,这是在存档写入zip之前结束的主要进程

因此,它应该包含在一个承诺中,比如:

    async function zipDirectory(source, dest) {
  const stream = fs.createWriteStream(dest);
  const archive = archiver('zip', { zlib: { level: 9 } });

  archive.on('error', function(err) {
  throw err;
  });

  await new Promise((resolve, reject) => {
    archive.pipe(stream);
    archive.directory(source, false);
    archive.on('error', err => {throw err;});
    archive.finalize();

    stream
        .on('close', function() {
        console.log(`zipped ${archive.pointer()} total bytes.`);
        resolve();
        });
  });
}

tmp文件夹和我的app.js文件在同一个目录中,因此我使用了_dirname