2015-10-20 76 views
0

根据该链接:request - Node节点请求模块Http.IncomingMessage不发射事件

的回调参数得到3个参数:

错误适用(通常从http.ClientRequest对象)一种 HTTP时.IncomingMessage对象第三是响应主体(字符串或 缓冲液,或者如果JSON选项被提供JSON对象)

代码:

var r = require("request"); 

var options= { 
    url: "http://www.example.com/" 
}; 

var callback = function (err, res, body) { 
    if (!err && res.statusCode == 200) { 
     res.on("data", function(chunk) { 
      console.log("DATA : "+chunk); 
     }); 
     res.on("finish", function() { 
      console.log("FINISHED"); 
     }); 
     console.log(body); 
    } 
}; 

r(options, callback); 

但在上面的代码中,只有console.log(body)工作,事件发射器不。

此外,如果只有在整体响应是body的情况下才会调用回调函数,那么当我无法对其进行流式处理时,将第二个参数设置为http.IncomingMessage(可读流)有什么意义。

+0

你期望得到什么数据?如果它只是从URL返回的HTML,那是'body'? – adeneo

+0

我知道这是在身体。那么为什么第二个参数是'http.IncomingMessage',其中'data'和'finish'事件没有任何用处。为什么它不只是一个带响应参数的普通对象? –

回答

1

当你通过这样的回调时,request为你缓冲整个回复,这就是body中的可用回复。因此,这意味着您将不会在res上看到data和此类事件,因为他们已被request照顾。

+0

我只是认为,因为它是一个Http.IncomingMessage类型的对象,那么它可能有这些事件。我想不出有什么其他的理由来使它成为这种类型。 –

+0

响应对象被传入,因为它包含诸如'statusCode','headers'等的内容,这些内容除了响应主体外还是有用的信息。传递原始响应对象比将复制的选择属性复制到新对象更简单/更高效。 – mscdex

0

看起来你正在混合两种不同的方式来使用'request'模块。根据偏好,您可以使用回调方法或流式方法。

回调方法包括传递一个函数以及选项,当所有数据都被接收到时,它会调用回调函数。

流式方法允许您将侦听器附加到“响应”等事件。我猜你已经从接收http请求和发送响应到节点服务器的例子中混合了这些代码,因为我无法在请求模块的文档中看到对'data'和'finish'事件的任何引用。

+0

是的,在文档中没有提及。我只是认为,因为它是一个'Http.IncomingMessage'类型的对象,那么它可能有这些事件。我没有想到有任何其他的理由使它成为这种类型。 –

+0

作为一个猜测,如果你使用了流式处理方法,他们会返回相同的对象,即完成'r(options).on('data',// etc' – piemonkey