【问题标题】:Why 'readable' event won´t fire for my ClientRequest?为什么我的 ClientRequest 不会触发“可读”事件?
【发布时间】:2017-03-12 14:40:55
【问题描述】:

我正在 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();
}

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

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

新 p2:更仔细地阅读 NodeJS 文档后,我意识到我在错误的对象上调用事件,我必须在响应对象上调用它们。

【问题讨论】:

    标签: javascript node.js stream


    【解决方案1】:

    阅读文档后,我很清楚我在错误的对象上调用了方法: - '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();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多