nodejs中response的data事件内JSON.parse处理请求数据报错SyntaxError: Unexpected end of JSON input

错误代码

    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));//成功
		});
		
    });

参考文章 详解node.js中的可读流(Readable)和可写流(Writeable).

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小勇对你热爱不息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值