2016-02-22 51 views
4

我使用Exceljs快速创建Excel数据如何从可写入的流中创建可读流? (Node.js)

我想在内存中缓存这个东西,然后使用Koa将其发送给用户。

为Exceljs的write方法需要一个writableStream:

workbook.xlsx.write(writableStream, options)

BUT兴亚期望一个可读流:

response.body = readableStream

我知道可以通过管道将可读流引入可写的流,但我怎么做相反?我希望Exceljs写入可写入流并让Koa从同一个流中读取。我非常沮丧的Stream API!

在其他的20两件事,我尝试这样做:

const ReadableStream = require("memory-streams").ReadableStream 

const reader = new ReadableStream() 

const writer = new stream.Writable({ 
    write: function(chunk, encoding, next) { 
     console.log(chunk.toString()) 
     // reader.push(chunk, encoding) 
     next() 
    } 
}) 

const reader = new MemoryStream(null, {readable: true}) 
// reader.write = reader.unshift 
const writer = reader 

workbook.xlsx.write(writer, {}) 
return reader 

但它不工作,我得到一些奇怪的错误有关无法写入时关闭的流。即使我处理了错误,但是,我的Excel文件无法打开。

那么如何从可写入的流中创建可读流呢?

+0

最大使用流,做CPU密集型的东西,像这样的节点是值得商榷的 –

回答

1

您需要一个变换流。它既可读又可写。

stream = new require('stream').Transform() 
stream._transform = function (chunk,encoding,done) 
{ 
    this.push(chunk) 
    done() 
} 
+0

我看了看文档,我的头就麻木了。有什么建议么?我正在寻找一些愚蠢的东西,就像身份函数的等价物:一个什么都不做的变换。 –

+0

我已经更新了答案。 – user619271

+0

有几件事情没有理解到底发生了什么...你如何使用这个'Transform'?你如何将它传递给可写/可读流(这是最初的问题)? –

0

对于所有需要流可写和可读的人员。这是最终为我工作的。

用例是QRCode包从动态var(例如:userId)生成QRCode png图像,只能使用stream.Writable - >仅通过stream.Readable上传到AWS S3存储桶。

import QRCode from 'qrcode'; 
import AWS from 'aws-sdk'; 
import { Transform } from 'stream'; 

const userId = 'userIdString'; 

// AWS Config, import this from a safe place!!! 
AWS.config.update({ 
    accessKeyId: 'xxxxxxxxxx', 
    secretAccessKey: 'xxxxxxxxx', 
    region: 'xxxxxxx', 
}); 

const s3 = new AWS.S3({ apiVersion: '2006-03-01' }); 

// Create Stream, Writable AND Readable 
const inoutStream = new Transform({ 
    transform(chunk, encoding, callback) { 
    this.push(chunk); 
    callback(); 
    }, 
}); 

// Need writable stream 
QRCode.toFileStream(inoutStream, userId); 

//Just to check 
inoutStream.on('finish',() => { 
    console.log('finished writing'); 
}); 

// Need readable stream 
    s3.upload(
    { 
     Bucket: 'myBucket', 
     Key: `QR_${userId}.png`, 
     Body: inoutStream, 
     // ACL: 'public-read', 
     ContentType: 'image/png', 
    }, 
    (err, data) => { 
     console.log(err, data); 
    }, 
) 
    .on('httpUploadProgress', (evt) => { 
    console.log(evt); 
    }) 
    .send((err, data) => { 
    console.log(err, data); 
    }); 

如果你从未this is a very good source.

相关问题