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()
ます。ブラウザがすべてを取得するまで本文を解析しないのか、応答が完了するまで本文を送信しないのかはわかりません。