nodejs – parsing分块twitter json
nodejs服务器从Twitter获取这个JSONstream并将其发送到客户端:
stream.twitter.com/1/statuses/filter.json?track=gadget
返回给客户端的数据是'chunked'JSON,客户端的JSON.parse(chunk)和eval('('+ chunk +')')导致parsing错误。 连接夹块并等待“结束”事件也不是解决scheme
我注意到之前的样本在客户端使用了类似于以前的工作:
socket.onmessage = function(chunk) { data = eval("(" + chunk.data + ")"); alert(data.user.screen_name);
我在客户端使用它,并导致parsing错误:
var socket = new io.Socket(); socket.on('message', function(chunk) { var data = eval('(' + chunk + ')'); // parsing error alert(data.screen_name):
我知道它成功地返回一个JSON块:
var socket = new io.Socket(); socket.on('message', function(chunk) { alert(chunk): // shows a JSON chunk
服务器:
response.on('data', function (chunk) { client.each(function(e) { e.send(chunk); });
有什么改变,或者我做错了什么?
更新: '结束'事件不会触发,因为它的stream?
http.get({ headers: { 'content-type': 'application/json' }, host: 'stream.twitter.com', path: '/1/statuses/filter.json?track... }, function(res) { res.setEncoding('utf8'); res.on('data', function (chunk) { client.each(function(e) { e.send(chunk); }); }); // does not fire res.on('end', function () { }); ...
我正在寻找与http 1.0和http 1.1的区别就发送分块的数据。
查看Twitter文档中标题为“ 分析响应”的部分。
从Streaming APIparsingJSON响应很简单,每个对象都是在自己的行上返回,并以回车结束。 换行字符(\ n)可能出现在对象元素(例如状态对象的文本元素)中,但回车符(\ r)不应该出现。
在服务器端,不断累积块,直到看到回车"\r"
。 一旦find回车,提取string到回车,这给了我们一个鸣叫。
var message = ""; // variable that collects chunks var tweetSeparator = "\r"; res.on('data', function(chunk) { message += chunk; var tweetSeparatorIndex = message.indexOf(tweetSeparator); var didFindTweet = tweetSeparatorIndex != -1; if (didFindTweet) { var tweet = message.slice(0, tweetSeparatorIndex); clients.forEach(function(client) { client.send(tweet); }); message = message.slice(tweetSeparatorIndex + 1); } });
客户变得简单。 简单地将套接字消息parsing为JSON。
socket.on('message', function(data) { var tweet = JSON.parse(data); });
@Anurag I'cant添加评论,但不是
if (chunk.substr("-1") == "\r")
它应该是:
if ( chunk.charCodeAt(chunk.length-2) == 13 )
回车不是最后一个字符。
我会build议pipe道响应到一个JSONparsing器。 你可以使用这个: https : //github.com/dominictarr/JSONStream