错误代码
var req = http.request(options,
function(res) {
res.setEncoding('utf-8');
res.on('data',
function(re) {
//完整数据50000字符左右
console.log(res.length)//获取的数据在5000字符左右
console.log(JSON.parse(re));//SyntaxError: Unexpected end of JSON input
//获取的数据不完整,JSON.parse失败
//因为IncomingMessage是流式读取,所以每次只能读取一部分数据
});
});
报错信息
Node.js的流就是为了在有限的内存中实现我们操作"海量"数据的目标。
流是一组有序的,有起点和终点的字节数据传输手段,它是一个抽象的接口,被 Node 中的很多对象所实现。node里很多内容都应用到流,比如HTTP 服务器request和response对象都是流。
它不关心文件的整体内容,只关注是否从文件中读到了数据,以及读到数据之后的处理。
可读流(Readable)
可读流分为:流动模式(flowing mode)和暂停模式(paused mode)
可读流在创建时都是暂停模式。暂停模式和流动模式可以互相转换。
1) 流动模式(flowing mode)
流动模式下,数据会源源不断地生产出来,形成“流动”现象。监听流的data事件便可进入该模式。
2) 暂停模式(paused mode)
暂停模式下,需要显示地调用read(),触发data事件。
在初始状态下,监听data事件,会使流进入流动模式。但如果在暂停模式下,监听data事件并不会使它进入流动模式。为了消耗流,需要显示调用read()方法。
解决办法
将数据处理放在end事件里面
var data='';
var req = http.request(options,
function(res) {
res.setEncoding('utf-8');
res.on('data',
function(re) {
data += re;//将所有数据读取完
});
res.on('end',
function() {
console.log(JSON.parse(data));//成功
});
});