0

KOAと Node.JS ストリームを学習しています。

私がしようとしているのは、部分的な HTTP 応答を送信し、しばらくして残りの応答を送信することです。

app.get("/", function*(next) {

  // TEST:
  function delay(ms) {
    return function(callback) {
      setTimeout(callback, ms);
    }
  }

  this.type = "text/plain";

  var Readable = require("stream").Readable;
  var stream = this.body = new Readable();

  stream._read = function () {};

  stream.push('First line.\n');

  yield delay(2000);

  stream.push('Last line.\n');

  stream.push(null);

  console.log("done");

});

ブラウザでページをロードしているときに、「最初の行」になると思います。がすぐに表示され、2 秒後に「2 行目」も表示されます。代わりに、応答が全体として送信されるようです。

ここで何が欠けていますか?

最後に、ブラウザへの長期接続で内部的に生成されたログ データをストリーミングしたいと考えています。

ノード 0.11.3 と Koa 0.10.0

4

1 に答える 1

0

ストリームは後でパイプされます。関数内でデータをフラッシュする機会はありません。
コードを確認してください:

var koa = require('koa')
var Readable = require('stream').Readable
var app = koa()

app.use(function*(next){

    this.type = 'text/plain'

    var stream = this.body = new Readable()
    stream._read = function () {}

    // isn't piped
    console.log(stream._readableState.pipes != null)

    yield function (callback) { setTimeout(callback, 2000) }

    // not yet
    console.log(stream._readableState.pipes != null)

    var i = 0
    setTimeout(function f(){
        if (i == 0)
            // now it is
            console.log(stream._readableState.pipes != null)
        stream.push(Date() + '\n');
        if (++i < 200)
            setTimeout(f, 50)
        else
            stream.push(null)
    }, 100)

})

app.listen(80)

さて、私は koa にあまり詳しくないので、別の解決策が存在する可能性があります。

于 2014-09-25T17:24:47.143 に答える