【问题标题】:Node request module Http.IncomingMessage not emitting events节点请求模块 Http.IncomingMessage 未发出事件
【发布时间】:2015-10-20 23:02:23
【问题描述】:

根据此链接:request - Node

回调参数有 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) 有效,事件发射器无效。

另外,如果只有当整个响应的主体可用时才会调用回调,那么当我无法流式传输它时,将第二个参数设为 http.IncomingMessage(Readable Stream) 有什么意义。

【问题讨论】:

  • 您希望获得什么数据?如果只是从 URL 返回的 HTML,那是在 body 中?
  • 我知道那是在身体里。那么为什么第二个参数是 http.IncomingMessagedatafinish 事件没有任何用处。为什么它不只是一个带有响应参数的普通对象?

标签: javascript node.js node-request


【解决方案1】:

当您传递这样的回调时,request 会为您缓冲整个响应,这就是 body 中可用的内容。因此,这意味着您不会在res 上看到data 和此类事件,因为它们已经由request 处理。

【讨论】:

  • 我只是想,既然它是一个 Http.IncomingMessage 类型的对象,那么它可能会有这些事件。我想不出任何其他理由让它成为这种类型。
  • 传入响应对象是因为它包含诸如statusCodeheaders 之类的内容,除了响应主体之外,这些都是有用的信息。仅传递原始响应对象比将选择属性从中复制到新对象更容易/更有效。
【解决方案2】:

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

回调方法涉及传递一个函数以及选项,当接收到所有数据时,它将调用回调函数。

流式传输方法允许您将侦听器附加到“响应”等事件。我猜你已经从接收http请求和使用节点服务器发送响应的示例中混合了这段代码,因为我在请求模块的文档中看不到任何对“数据”和“完成”事件的引用.

【讨论】:

  • 是的,文档中没有提及。我只是想,既然它是一个Http.IncomingMessage 类型的对象,那么它可能会有这些事件。我想不出任何其他理由让它成为这种类型。
  • 猜测如果您使用流式方法,它们将返回相同的对象,即完成r(options).on('data', //etc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2021-08-15
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2019-02-09
相关资源
最近更新 更多