node zlib使用gzip报Error: write after end

http请求静态文件返回使用gzip压缩时候报错,不开启gzip使用注释部分则正常

关键代码片段:

const gzip = require('zlib').createGzip();

res.statusCode = 200;
res.setHeader('Content-Type', type);
res.setHeader('Content-Encoding', 'gzip');

// fs.readFile(pathname, (err, data) => {
//   res.end(data);
// })

fs.createReadStream(pathname).pipe(gzip).pipe(res); //关键语句

报错:

Error: write after end
    at writeAfterEnd (_stream_writable.js:195:12)
    at Gzip.Writable.write (_stream_writable.js:242:5)
    at ReadStream.ondata (_stream_readable.js:555:20)
    at emitOne (events.js:96:13)
    at ReadStream.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:176:18)
    at ReadStream.Readable.push (_stream_readable.js:134:10)
    at onread (fs.js:2026:12)
    at FSReqWrap.wrapper [as oncomplete] (fs.js:683:17)

较小的html文件能正确返回,比较大css和js却返回不了,请问下我这是哪里写错了或是少了什么吗?

阅读 4.4k
2 个回答

你应该在每次接收到请求的时候, 新创建一个 gzip 对象, 而不是在一开始的时候就创建。

const gzip = require('zlib').createGzip;

//...

fs.createReadStream(pathname).pipe(gzip()).pipe(res);

另外, 推荐使用现成的库, 比如compression

const zlib = require('zlib');
...
fs.createReadStream(pathname).pipe(zlib.createGzip()).pipe(res);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题