簡體   English   中英

NodeJS 中 response.write 與 stream.pipe(response) 的區別

[英]Difference between response.write vs stream.pipe(response) in NodeJS

據我了解,“response.write”可以更好地控制我正在寫入的數據塊,而管道對數據塊沒有任何控制權。

我正在嘗試流式傳輸文件,並且不需要對數據塊進行任何控制,因此是否建議使用 stream.pipe(response) ? 是否有任何優勢,例如性能優於 response.write?

 downloadStream = readBucket.openDownloadStream(trackID)
 downloadStream.on('data', chunk => {
      console.log('chunk');
      res.write(chunk);
    });

    downloadStream.on('error', error => {
      console.log('error occured', error)
      res.sendStatus(500);
    });

    downloadStream.on('end', () => {
      res.end();
    });

對於我的場景,兩個代碼都做同樣的事情。 我更喜歡管道,因為代碼較少。 pipe() 與 response.write 相比是否有任何性能優勢、內存/io 效率優勢?

downloadStream= readBucket.openDownloadStream(trackID)
      downloadStream.pipe(res);

.pipe()只是一種將讀取流發送到寫入流的現成方法。 如果需要,您當然可以手動對其進行編碼,但是.pipe()為您處理許多事情。

我建議它有點像fs.readFile() 如果您想要做的是將整個文件讀入內存, fs.readFile()會打開文件進行讀取,將所有數據讀入緩沖區,關閉目標文件並在最后為您提供所有數據. 如果有任何錯誤,它會確保您正在閱讀的文件被關閉。

.pipe()也是如此。 它為您連接到datafinisherror事件,並只處理所有這些,同時將數據流式傳輸到我們的寫入流中。 根據寫入流的類型,即使存在錯誤,它還負責“完成”或“關閉”讀取流和寫入流。

而且, .pipe()具有回流處理功能,而您的代碼則沒有。 當您調用res.write()它返回一個布爾值。 如果該布爾值為true ,則寫入緩沖區已滿,您不應該再次調用res.write() ,直到drain事件發生。 請注意,您的代碼不會這樣做。 因此, .pipe()比許多人通常自己編寫的更完整。

我見過的唯一情況是,您通常會執行類似管道的操作,但不能使用.pipe()是當您在錯誤情況下具有非常自定義的行為並且您想要做一些與默認值大不相同的事情時錯誤處理。 對於僅流式傳輸數據並完成輸入和輸出流,在錯誤時終止兩者,它完全符合您的要求,因此當所需的行為已經內置時,真的沒有理由自己編寫代碼。

對於我的場景,兩個代碼都做同樣的事情。 我更喜歡管道,因為代碼較少。

同樣在這里。

pipe() 與 response.write 相比是否有任何性能優勢、內存/io 效率優勢?

是的,有點。 它的錯誤可能比您自己編寫的代碼少(例如忘記了示例中的回流檢測,這可能僅在某些情況下、大數據、慢速連接中出現)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM