2016-02-22 74 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.

相關問題