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に)Iを実行すると、ページはストリーミングされなくなります。つまり、express.compress()応答が終了するまで待機してから、応答全体をgzipで圧縮してから送信するようです。res.writeそれぞれにgzip圧縮された応答(具体的には、すべてのドレイン)を送信してもらいたいです。応答を正しく圧縮するにはどうすればよいですか?

編集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 に答える