为什么'可读'事件不会触发我的ClientRequest?

时间:2017-03-12 14:40:55

标签: javascript node.js stream

我在NodeJS上测试一小块代码,它应该创建一个ClientRequest对象并触发三个事件:

  • '回复'活动
  • '可读'事件
  • '结束'活动

以下是我正在测试的一大块代码:

var http = require('http');
var server = http.createServer();
var link = "www.asos.com";

// now that server is running
server.listen(1337, '127.0.0.1', function(){
  tryMe();
});

 function tryMe(){
    var options = {
      hostname: link,
      port: 80,
      method: "GET"
    };
    var asosRequest = http.request(options);
    asosRequest.on("response", function(res){
      console.log("response");
    });
    asosRequest.on('readable', function() {
      console.log("readable");
    });
    asosRequest.on('end', function(){
      console.log("Bey!");
    });
    asosRequest.end();
}

我无法弄清楚为什么“可读”和“结束”事件不会触发我的情况。 “response”事件正常工作并返回正确的信息和数据缓冲区。有什么我误解了数据流在节点中的工作方式吗?

NEW: 我使用节点版本v7.7.2。 如果我尝试“数据”事件,它也不会触发。

新p2:在仔细阅读NodeJS文档之后,我意识到我在一个错误的对象上调用了事件,我不得不在响应对象上调用它们。

1 个答案:

答案 0 :(得分:0)

阅读完文档后,我清楚地知道我在错误的对象上调用方法:   - 'response'事件仅在http.ClientRequest对象上触发,然后你有,响应事件回调有一个参数“response”,表示http.IncomingMessage的一个实例。这基本上是我需要调用“数据”,“可读”和“结束”事件的对象,因为它代表一个可读的流。

以下是NodeJs文档中的链接:

现在代码就像这样运行并运行:

var http = require('http');
var server = http.createServer();
var link = "www.asos.com";

// now that server is running
server.listen(1337, '127.0.0.1', function(){
  tryMe();
});

function tryMe(){
   var options = {
      hostname: link,
      port: 80,
      method: "GET"
   };
   var asosRequest = http.request(options);
   asosRequest.on("response", function(res){
      res.on("data", function(data){
      console.log("data");
   });
   res.on("readable", function(){
     console.log("redable");
     res.read();
   });
   res.on("end", function(){
     console.log("end");
   })
   console.log("response");
   console.log(res.statusCode);
   console.log(res.statusMessage);
});

asosRequest.on('end', function(){
  console.log("Bey!");
});

asosRequest.end();
}