Nodejs http.request请求中的data怎么打印?

Nodejs http.request请求中的data怎么打印?

var http = require(‘http’)
var $ = require(‘jquery’)
var url = require(‘url’)
var BufferHelper = require(‘bufferhelper’);
var options = {
hostname:‘ask.39.net’,
path:’/’,
method:‘GET’,
headers:{
‘Accept’:’/’,
‘Connection’:‘close’,
‘User-Agent’:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31’
}
}
var bufferHelper = new BufferHelper();
var req = http.request(options,function(res){
res.on(‘data’, function (chunk) {
bufferHelper.concat(chunk)
});
})
req.end()
console.log(bufferHelper.toBuffer().toString())strong text

上面的data一直无法正常打印出来了。求修改代码


5 回复

要解决Node.js http.request 请求中 data 事件无法正确打印数据的问题,我们需要确保在所有数据都接收到之后再进行处理。这通常通过监听 end 事件来实现,该事件会在所有数据接收完毕后触发。

下面是修改后的代码示例:

var http = require('http');
var url = require('url');
var BufferHelper = require('bufferhelper');

var options = {
    hostname: 'ask.39.net',
    path: '/',
    method: 'GET',
    headers: {
        'Accept': '*/*',
        'Connection': 'close',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31'
    }
};

var bufferHelper = new BufferHelper();

var req = http.request(options, function (res) {
    // 监听 data 事件,并将数据片段添加到 bufferHelper 中
    res.on('data', function (chunk) {
        bufferHelper.concat(chunk);
    });

    // 监听 end 事件,在所有数据接收完毕后打印结果
    res.on('end', function () {
        console.log(bufferHelper.toBuffer().toString());
    });
});

req.end();  // 发送请求

解释

  1. 初始化:我们首先引入了必要的模块(http, url, bufferhelper)并设置了请求选项。
  2. 创建缓冲区助手:使用 BufferHelper 来存储接收到的数据片段。
  3. 发送请求:使用 http.request 发起一个HTTP GET请求。
  4. 监听 data 事件:当接收到数据时,调用 bufferHelper.concat(chunk) 将数据片段追加到缓冲区中。
  5. 监听 end 事件:当所有数据都已接收完毕时,调用 bufferHelper.toBuffer().toString() 将整个响应体转换为字符串,并打印出来。

这种方式可以确保在所有数据都被接收后才进行处理,避免了由于数据片段未完全接收而导致的错误。


res 除了用 data 事件, 还有 end, 事件, 打印是在 res.on "end" 的回调函数里执行的 因为 Node 是异步, 所以代码 console.log 执行的时候其实 bufferHelper 还没数据 参考: http://docs.nodejitsu.com/articles/HTTP/clients/how-to-create-a-HTTP-request

console.log怎么写在了end()的外面?貌似典型的同步编程思维

OK,增加了res.on(‘end’)事件就打印出来了。。

在Node.js中使用http.request时,data事件会被触发多次,每次传入的数据块可能非常小。因此,你需要将这些数据块累积起来,最后再处理整个响应体。你当前的代码已经正确地使用了BufferHelper来累积数据块,但需要注意的是,在所有data事件触发完毕之前,不要急于输出累积的数据。

根据你的代码,你可以稍微调整一下,确保在response对象的end事件被触发后打印数据。以下是修改后的示例代码:

var http = require('http');
var url = require('url');
var BufferHelper = require('bufferhelper');

var options = {
    hostname: 'ask.39.net',
    path: '/',
    method: 'GET',
    headers: {
        'Accept': '*/*',
        'Connection': 'close',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31'
    }
};

var bufferHelper = new BufferHelper();

var req = http.request(options, function (res) {
    res.on('data', function (chunk) {
        bufferHelper.concat(chunk);
    });

    res.on('end', function () { // 确保在所有数据接收完毕后再处理
        console.log(bufferHelper.toBuffer().toString());
    });
});

req.end();

在这段代码中,我添加了一个end事件监听器,当服务器响应结束时(即所有数据块都已接收到),它会调用bufferHelper.toBuffer().toString()来将累积的数据转换为字符串并打印出来。这样可以确保即使data事件被多次触发,最终累积的数据也是完整的。

回到顶部