流写入流以读取流

时间:2014-05-16 13:56:54

标签: node.js streaming

我在nodejs中使用一个可以从读取流中读取的库。我正在打开一个文件读取流并将其传递给lib。但是我还需要在我正在阅读的文件系统上创建文件。因此,第1步是创建一个写文件流并将我的数据流式传输到该文件。

  1. 数据写入流----->文件
  2. http响应< ------读取流文件
  3. 我不喜欢这个过程的事情是我必须在完成后清理文件系统。有没有办法可以直接写入读取流并一步完成所有操作?

    修改 具体示例(使用https://github.com/ctalkington/node-archiver):

    // some route
    function(req, res, next) {
        var archive = archiver('zip');
        res.attachment("icons.zip");
        archive.pipe(res);
    
        // I have to create files on file system
        var stream1 = fs.createWriteStream("file1.txt");
        var stream2 = fs.createWriteStream("file2.txt");
        ...
        // all stuff is one streaming to file system
    
        // now stream stuff from file system to archive
        archive
          .append(fs.createReadStream("file1.txt"), { name: 'file1.txt' })
          .append(fs.createReadStream("file2.txt"), { name: 'file2.txt' })
          .finalize();
    
    }
    

    我不知道如何首先避免流式传输到文件系统。

    编辑:

    简单的问题就是这样:

    我可以写一个可读的流吗?

2 个答案:

答案 0 :(得分:2)

似乎这么容易回答,不能相信我错过了这个。

看起来我可以使用PassThrough:

http://nodejs.org/api/stream.html#stream_class_stream_passthrough

  

Class:stream.PassThrough#这是一个简单的实现   转换流,简单地将输入字节传递给   输出。它的目的主要是用于实例和测试,但也有   偶尔使用它作为构建块可以派上用场的情况   对于新型的溪流。

答案 1 :(得分:0)

将可读流传输到响应或可写流。

要管道到客户端,您可以执行以下操作:

// the response object is a writable stream too.

// Send the headres first (Dont forget these, and change the content type.)

res.writeHead(200, {
  'Content-Type': 'application/pdf',
  'Access-Control-Allow-Origin': '*'
});
var resStream  = readableStm.pipe(res);  // readableStm should be a READABLE stream

// listen to the finish ev.
resStream.on('finish', function () {
  res.end();
});