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一直无法正常打印出来了。求修改代码
要解决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(); // 发送请求
解释
- 初始化:我们首先引入了必要的模块(
http
,url
,bufferhelper
)并设置了请求选项。 - 创建缓冲区助手:使用
BufferHelper
来存储接收到的数据片段。 - 发送请求:使用
http.request
发起一个HTTP GET请求。 - 监听
data
事件:当接收到数据时,调用bufferHelper.concat(chunk)
将数据片段追加到缓冲区中。 - 监听
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
事件被多次触发,最终累积的数据也是完整的。