2017-06-12 47 views
0

我有一個ReadStream,我想多次讀取。 readStream是使用fs.createReadStream創建的。獲取ReadStream的哈希值和流的輸出數據

我用它來得到它的md5哈希第一次,我與模塊hasha,功能fromStream,而我使用它與FormData上傳文件到虛擬主機的第二次這樣做。

如何使用這一個ReadStream來完成這兩件事?

readStream = fs.createReadStream("/tmp/test.txt"); 
hash = await hasha.fromStream(readStream, hashOptions); 
readStream.on("data", (chunk) => console.log("data chunk", chunk)).on("end",() => console.log("finished")); 

它不登錄電子內容到控制檯,因爲它應該,可能是因爲在hasha.fromStreampipe -ing流。如果我不執行hasha.fromStream它工作正常,塊會被記錄下來。

我使用的模塊,稱爲hasha在GitHub上:https://github.com/sindresorhus/hasha/blob/master/index.js#L45

我不想保存數據得到散列之前緩衝,因爲我會用它處理大文件。

我也取得了runkit腳本顯示我的問題,你可以在那裏玩它: https://runkit.com/5942fba4653ae70012196b77/5942fba4653ae70012196b78

+0

或許可以這麼用? https://github.com/karmadude/stream-n-way – robertklep

+0

謝謝,但它不是我正在尋找 – xerq

回答

1

這裏有一個關於如何「叉」一個流一個獨立的例子,所以你可以把它管道到兩個目的地:

const PassThrough = require('stream').PassThrough; 

async function hashAndPost(stream) { 
    let pass1 = new PassThrough; 
    let pass2 = new PassThrough; 

    stream.pipe(pass1); 
    stream.pipe(pass2); 

    // Destination #1 
    pass1.on('data', chunk => 
    console.log('data chunk', chunk.toString()) 
).on('end',() => 
    console.log('finished') 
); 

    // Destination #2 
    let hash = await hasha.fromStream(pass2, { algorithm : 'md5' }); 
    console.log('hash', hash); 
}; 
2

您可以重新通過重新讀取文件流,也可以倒帶流,如解釋在這裏:How to reset nodejs stream?

+0

我不喜歡它如何將緩衝區保存到數組,如果流可能是10GB?關於重新創建 - 在模塊中,我正在對輸入進行操作,我僅僅使用流,我不知道文件路徑或者甚至是文件。 – xerq

+0

@xerq我從那個答案中實際發佈了一個包:[rereadable-stream](https://www.npmjs.com/package/rereadable-stream)。它仍然會在數組中累積流部分,但是您可以控制它。 如果您只需要在兩個方向上推送流 - 爲什麼不管兩次? –