node.js-在输出为缓冲区的位置使用archiver

node.js-在输出为缓冲区的位置使用archiver,node.js,archiverjs,Node.js,Archiverjs,我想把一些可读的流压缩成一个可写的流。 其目的是在内存中完成所有操作,而不是在磁盘上创建实际的zip文件 为此,我使用了archiver let bufferOutput = Buffer.alloc(5000); let archive = archiver('zip', { zlib: { level: 9 } // Sets the compression level. }); archive.pipe

我想把一些可读的流压缩成一个可写的流。 其目的是在内存中完成所有操作,而不是在磁盘上创建实际的zip文件

为此,我使用了archiver

        let bufferOutput = Buffer.alloc(5000);
        let archive = archiver('zip', {
            zlib: { level: 9 } // Sets the compression level.
        });
        archive.pipe(bufferOutput);
        archive.append(someReadableStread, { name: test.txt});
        archive.finalize();
我在第
archive.pipe(bufferOutput)行得到一个错误

这是错误:“dest.on不是函数”

我做错了什么? Thx

更新

我正在运行以下代码进行测试,但是ZIP文件没有正确创建。我错过了什么

const   fs = require('fs'),
    archiver = require('archiver'),
    streamBuffers = require('stream-buffers');

let outputStreamBuffer = new streamBuffers.WritableStreamBuffer({
    initialSize: (1000 * 1024),   // start at 1000 kilobytes.
    incrementAmount: (1000 * 1024) // grow by 1000 kilobytes each time buffer overflows.
});

let archive = archiver('zip', {
    zlib: { level: 9 } // Sets the compression level.
});
archive.pipe(outputStreamBuffer);

archive.append("this is a test", { name: "test.txt"});
archive.finalize();

outputStreamBuffer.end();

fs.writeFile('output.zip', outputStreamBuffer.getContents(), function() { console.log('done!'); });

缓冲区不是流,你需要一些类似于

的东西。缓冲区不是流,你需要一些类似于

的东西。至于你为什么看到垃圾,这是因为你看到的是压缩的数据,这看起来像垃圾


要验证压缩是否有效,您可能需要再次解压并检查输出是否与输入匹配。

至于您看到垃圾的原因,这是因为您看到的是压缩后的数据,看起来像垃圾


要验证压缩是否有效,您可能需要再次解压缩并检查输出是否与输入匹配。

在您更新的示例中,我认为您正在尝试在写入内容之前获取内容

钩住finish事件,然后获取内容

outputStreamBuffer.on('finish', () => {
  // Do something with the contents here
  outputStreamBuffer.getContents()
})

在您更新的示例中,我认为您试图在编写之前获取内容

钩住finish事件,然后获取内容

outputStreamBuffer.on('finish', () => {
  // Do something with the contents here
  outputStreamBuffer.getContents()
})

通过在archiver上添加事件侦听器,我可以:

archive.on('finish', function() {
   outputStreamBuffer.end();
   // write your file
});

通过在archiver上添加事件侦听器,我可以:

archive.on('finish', function() {
   outputStreamBuffer.end();
   // write your file
});

Thx Dave,我已经添加了一个后续问题,如果你也能帮上忙Thx Dave,我已经添加了一个后续问题,如果你也能帮上忙,我只是注意到它实际上卡在了“outputStreamBuffer.getContents().pipe(output);”上,并且没有处理DAH,因为,
outputStreamBuffer.getContents()
给了你一个缓冲区而不是流,因此它没有
pipe()
函数。只需执行
fs.writeFile('output.zip',outputStreamBuffer.getContents(),function(){console.log('done!');})嗯。。。还是不为我工作。如果你能看一下,我已经更新了我的问题。非常感谢您的帮助我刚刚注意到它实际上卡在了“outputStreamBuffer.getContents().pipe(output);”上,并且没有处理DAH,因为,
outputStreamBuffer.getContents()
给了您一个缓冲区而不是流,所以它没有
pipe()
函数。只需执行
fs.writeFile('output.zip',outputStreamBuffer.getContents(),function(){console.log('done!');})嗯。。。还是不为我工作。如果你能看一下,我已经更新了我的问题。谢谢你的帮助