如何在node.js中返回存档的可读流而无需写入文件系统?

时间:2016-11-01 07:00:59

标签: javascript node.js

我想重构我的函数以返回一个可读的流,我会将其传递给http请求模块, 目前我正在返回归档文件位置并从中创建一个读取流:

const filepath = yield archive.archiveFilesAsTargz('path', 'name.tar.gz');

fs.createReadStream(filepath).pipe(request(options)).then(body =>{
        console.log(body);
    });

我寻求的流程是:

  1. 获取目录位置并将其存档
  2. 以流形式获取存档并将其归还(解决它)
  3. 调用该函数并管道读取流以请求
  4. 我的功能如下:

        exports.archiveFilesAsTargz = function (dest, archivedName) {
        return new Promise((resolve, reject)=> {
            const name = slugify(archivedName);
            const filePath = path.join(dest, name + '.tar.gz');
            const output = fs.createWriteStream(filePath);
            const archive = archiver('tar', {
                gzip: true
            });
    
            archive.pipe(output);
            archive.directory(dest, name).finalize();
            output.on('close', ()=> resolve(filePath));
            archive.on('error' ,(err) => reject(err));
        });
    };
    

1 个答案:

答案 0 :(得分:1)

好的,所以在另一个阅读课程和戏剧之后我解决了......

function archiveFilesAsTargz (dest, name) {
        const archive = archiver('tar', {
            gzip: true
        });
        return archive.directory(dest, name).finalize();
}

以下内容将返回读取流:

archive.directory(dest, name).finalize();

所以使用它对我来说非常有用

const pack = archiveFilesAsTargz(zippath, 'liron');

pack.pipe(request(options)).then(body =>{
        console.log(body);
    })
    .catch(err => {
        console.log(err);
    });