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