如何在Node JSjs中正确使用双工流

  • 本文关键字:Node JSjs node.js stream
  • 更新时间 :
  • 英文 :


我需要编写一个脚本,该脚本将从Azure blob存储中提取文件,并通过github的API将它们推送到github存储库中。

Azure 存储包提供了方法blobService.getBlobToStream该方法,该方法期望其第三个参数是流,fs.createWriteStream('output.txt')作为示例给出

但是,要上传到GitHub,需要提供文件的base64编码内容。我使用 base64 流包

我已经检查了每个步骤是否独立工作,即我首先从 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()可读的流?

从node'js文档中,似乎require('stream').Duplex是我正在寻找的,但我无法使其工作,我找到的示例也不是很有启发性。如果我只是像这样使用它

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

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

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)

最新更新