节点流在结束错误后得到写入

时间:2017-05-14 20:25:49

标签: javascript node.js express stream gzip

我正在测试流上传和下载文件,下面是我真正简单的文件下载路径,解压缩我的压缩文件并通过流发送:

app.get('/file', (req, res) => {   
   fs.createReadStream('./upload/compress_aurelien-boquet.pdf')
      .pipe(unzip)
      .pipe(res); 
});

我正在使用快递4.15.2 btw。

当我尝试这条路线时,它第一次工作正常,并在我的浏览器上显示pdf,但如果我刷新页面,那么我的服务器会收到此错误:

events.js:163
      throw er; // Unhandled 'error' event
      ^

Error: write after end
    at writeAfterEnd (_stream_writable.js:191:12)
    at Unzip.Writable.write (_stream_writable.js:238:5)
    at ReadStream.ondata (_stream_readable.js:557:20)
    at emitOne (events.js:96:13)
    at ReadStream.emit (events.js:191:7)
    at readableAddChunk (_stream_readable.js:178:18)
    at ReadStream.Readable.push (_stream_readable.js:136:10)
    at onread (fs.js:1938:12)
    at FSReqWrap.wrapper [as oncomplete] (fs.js:629:17)

我想知道发生了什么事?

1 个答案:

答案 0 :(得分:2)

我的坏,是使用zlib库来gzip和解压缩文件,但我忘了“zlib.createGzip”和“zlib.createUnzip”返回一个流,所以我重用已经结束的流导致我'写完后错误'

我正在做的坏事:

app.get('/file', (req, res) => {

   fs.createReadStream('./upload/compress_aurelien-boquet.pdf')
      .pipe(zlib.createGunzip())
      .pipe(res);

});

要做的好事:

<script src="vendor/61345/js/script.js"></script>