如何在node.js中正确使用Duplex流

时间:2017-03-10 15:29:09

标签: node.js stream

我需要编写一个脚本,从Azure blob storage获取文件并通过github's API将它们推送到github存储库。

azure-storage package提供了方法blobService.getBlobToStream,它希望第三个参数成为一个流,fs.createWriteStream('output.txt')作为示例提供

然而,要上传到github,需要提供该文件的base64编码内容。我使用base64-stream package

我已经检查过每个步骤是否有效,即我先从azure下载文件,然后将其保存在磁盘上,然后从磁盘读取并对其进行编码,然后上传到github

// download first
blobService.getBlobToStream('...', '...', fs.createWriteStream('out'), ...
    var b64file = '';
    fs.createReadStream('out')
      .pipe(require('base64-stream').encode())
      .on('data', function (chunk) {
          b64file += chunk;
      })
      .on('end', function () {
          // upload to github
      });

如果没有将文件保存在磁盘上的间歇步骤,我可以这样做吗?我可以将blobService.getBlobToStream作为可写的流传递给.pipe(),但是require('stream').Duplex可读?

来自node'js docs似乎var Duplex = require('stream').Duplex; var wr_stream = new Duplex; var b64file = ''; wr_stream.createReadStream('out') .pipe(require('base64-stream').encode()) .on('data', function (chunk) { b64file += chunk; }) .on('end', function () { // upload to github }); // now I can download blobService.getBlobToStream('...', '...', wr_stream, ... 正是我所寻找的,但我无法使其发挥作用,我发现的例子也不是很有启发性。如果我只是像

那样使用它
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: not implemented
    at Duplex.Readable._read (_stream_readable.js:449:22)
    at Duplex.Readable.read (_stream_readable.js:328:10)
    at resume_ (_stream_readable.js:718:12)
    at nextTickCallbackWith2Args (node.js:437:9)
    at process._tickCallback (node.js:351:17)
    at Function.Module.runMain (module.js:443:11)
    at startup (node.js:134:18)
    at node.js:962:3

我得到例外

(?i)Win\w*\s*Server\s*(2008)(?!\sR2).*?$

1 个答案:

答案 0 :(得分:0)

由于您周围有流,因此无需创建任何自定义流。管道他们:

const { Base64Encode } = require('base64-stream')
const { WriteStream } = require('fs')
const blobService = azure.createBlobService()

const writer = new WriteStream('output.txt')
const encoder = new Base64Encode()

encoder.pipe(writer)

blobService('...', '...', encoder)