1
var express = require('express')

var app = module.exports = express()

function getImages(callback) {
  callback()
}

app
.set('views', __dirname + '/views')
.set('view engine', 'jade')
.get('/stream/images', function(req, res) {
  res.render('layout', function(err, body) {
    res.type('html')
    res.write(body.replace('</body></html>', ''))
    getImages(function(err) {
      res.render('streams/images', function(err, body) {
        var html = '<div class="layout-stream">' + body + '</div>'
        res.write(
          "<script>$('.pagelet-layout-stream').replaceWith(" + 
          JSON.stringify(html) + 
          "); emitter.emit('check:stream');</script>"
        )
        res.write("<script>emitter.emit('load');</script>")
        res.write('</body></html>')
        res.end()
      })
    })
  })
})
.listen(3013)

这完全符合预期。但是,当我.use(express.compress()).get准确地说是之前)时,页面不再流式传输。换句话说,express.compress()似乎要等到响应完成,然后 gzip 整个响应,然后发送它。我希望每个res.write人都发送一个压缩响应(或者特别是每个排水管)。如何正确压缩响应?

编辑 1 - 我试过这个:

var stream = zlib.createGzip()
stream.pipe(res)

stream.write(/* stuff */)
stream.end()

这与express.compress(). 我不确定浏览器是在获得完整内容之前不解析正文,还是在响应完成之前不发送正文。

4

1 回答 1

1
var stream = zlib.createGzip()
stream._flush = zlib.Z_SYNC_FLUSH
stream.pipe(res)

stream.write(/* stuff */)
stream.end()
于 2012-11-18T10:30:21.337 回答