2012-05-05 6 views
0

私は誓約とnodejsの周りを遊んでいます。Nodejs:vowsおよびnodejs httpモジュールで作業するときに応答本体を取得できません

var vows = require('vows'); 
var http = require('http'); 
var suite = vows.describe('testing'); 
var host = 'www.google.com', port = '80', path = '/', method = 'GET'; 

suite.addBatch({ 
    'A context': { 
     topic: function(){ 
      http.get({ 
       host: host, 
       port: port, 
       path: path, 
       method: method 
      }, this.callback); 
     }, 
     "sample test": function(res, extra){//here extra is just to prevent vows error 
      res.on('data', function (chunk) { 
       console.log('BODY: ' + chunk);//It never gets logged 
      }); 
      console.log('HEADERS: ' + JSON.stringify(res.headers));//it is working 
     } 
    } 
}); 

suite.export(module); 

しかし、私は応答体を得ることができません。私は間違って何をしています。誓いは、直接テストthis.callback実行を起動しないように

私はnodejsのV 0.6.6を使用して、私が見ることができるものからv0.6.2

答えて

1

を誓いています、それが見えます。それはprocessnextTickによって遅れています。私が推測しなければならないのであれば、その時に「データ」イベントが放出されているかもしれません。つまり、すべてのデータイベントがトリガーされるまで、データ関数をバインドしないということです。

しかし、問題は、誓約テストでは、このようなすべての非同期ロジックをtopicに分けることになっているということです。あなたが本当にテストでチャンクをチェックしたいなら、それをこのようにします。

チャンクはいくつでも構いません。ただ一つのdataイベントだけではありません。ストリームエンコーディングを設定し、データを文字列として結合することができます。現在のコードは、暗黙的にバッファを文字列に変換します。これはマルチバイト文字のために壊れる可能性があります。

suite.addBatch({ 
    'A context': { 
     topic: function(){ 
      var cb = this.callback; 
      var req = http.get({ 
       host: host, 
       port: port, 
       path: path, 
       method: method 
      }); 

      // Aggregate all chunks before running callback 
      req.on('response', function(res) { 
       var chunks = [] 
       res.on('data', function(chunk) { 
       chunks.push(chunk); 
       }); 
       res.on('end', function() { 
       cb(null, res, chunks); 
       }); 
      }); 

      // Handle connection failures. 
      req.on('error', cb); 
     }, 
     "sample test": function(err, res, chunks){ 
      chunks.forEach(function (chunk, i) { 
       console.log('BODY piece ' + i + ': ' + chunk); 
      }); 
      console.log('HEADERS: ' + JSON.stringify(res.headers)); 
     } 
    } 
}); 
関連する問題