我正在使用Exceljs
动态创建Excel数据我想在内存中缓冲这个东西,然后使用Koa将它发送给用户。
Exceljs的write
方法需要一个writableStream:
workbook.xlsx.write(writableStream, options)
但Koa希望可读流:
response.body = readableStream
我知道我可以将可读流传输到可写流中,但是我该怎么做?我希望Exceljs写入可写流并让Koa从同一个流中读取。我对流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 :(得分:6)
您需要一个变换流。它既可读又可写。
stream = new require('stream').Transform()
stream._transform = function (chunk,encoding,done)
{
this.push(chunk)
done()
}
答案 1 :(得分:3)
对于所有需要流可写和可读的人。这最终对我有用。
用例是QRCode包,仅使用stream.Writable - >从动态var(例如:userId)生成QRCode png图像。仅使用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);
});
之前使用过流式传输
答案 2 :(得分:0)
您是否考虑过Passthrough
流?这是一个简单的转换流,将传递给它的所有数据传递给您,因此您可以从可写流中读取。