当前位置: 首页 > 面试题库 >

nodejs-解析块状Twitter json

郭坚壁
2023-03-14
问题内容

nodejs服务器从Twitter“获取”此JSON流并将其发送到客户端:

stream.twitter.com/1/statuses/filter.json?track=gadget

返回给客户端的数据是“块状” JSON,并且客户端上的JSON.parse(chunk)和eval(’(’+ chunk
+’)’)都会导致解析错误。连接被卡住的部分并等待“结束”事件也不是解决方案

我注意到以前的示例在客户端上使用了类似的东西,这些东西以前似乎很有效:

  socket.onmessage = function(chunk) { 
  data = eval("(" + chunk.data + ")");
  alert(data.user.screen_name);

我在客户端使用它,它导致解析错误:

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);  
  });

发生了什么变化还是我做错了什么?

更新: ‘end’事件不会因为其流而触发?

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 API解析JSON响应很简单,每个对象都在自己的行上返回,并以回车结尾。对象元素(例如,状态对象的文本元素)中可能出现换行符(\
n),但回车符(\ r)不应出现。

在服务器端,继续堆积块,直到看到回车"\r"。找到回车符后,提取字符串直到回车符,这将给我们一条鸣叫。

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);
    }
});

客户端变得简单。只需将套接字消息整体解析为JSON。

socket.on('message', function(data) {
    var tweet = JSON.parse(data);
});


 类似资料:
  • 本文向大家介绍详解Nodejs的timers模块,包括了详解Nodejs的timers模块的使用技巧和注意事项,需要的朋友参考一下 本模块,属于来模拟一些浏览器自带方法的模块,比如setTimeout,clearTimeout等方法,之所以会有该模块,在我看来,也是为了能让前端工程师使用起来,更简单,使用一个单独的模块,来把浏览器上的功能来模拟出来,那么就可以直接减少学习的成本,这样就可以花更少的

  • 这节假设你已经了解了模块的一些基本知识 请阅读模块文档了解更多信息。 模块解析是指编译器在查找导入模块内容时所遵循的流程。 假设有一个导入语句import { a } from "moduleA"; 为了去检查任何对a的使用,编译器需要准确的知道它表示什么,并且需要检查它的定义moduleA。 这时候,编译器会有个疑问“moduleA的结构是怎样的?” 这听上去很简单,但moduleA可能在你写的

  • 本文向大家介绍深入浅析Nodejs的Http模块,包括了深入浅析Nodejs的Http模块的使用技巧和注意事项,需要的朋友参考一下 一、http服务器     我们知道传统的HTTP服务器是由Aphche、Nginx、IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,自身就可以用来构建服务器,例如: http模块中封装了一个HTTP服务器和一个简易的HTTP客户端

  • 我正在使用使用HTTPS和自签名证书托管的GRPC服务。当我使用以下语法连接时: 我得到这样的错误 任何人帮助我如何解决这个问题。 注意:我的操作系统是Windows 10,nodejs--v10.16.0,GRPC

  • 本文向大家介绍NodeJs中的VM模块详解,包括了NodeJs中的VM模块详解的使用技巧和注意事项,需要的朋友参考一下 什么是VM? VM模块是NodeJS里面的核心模块,支撑了require方法和NodeJS的运行机制,我们有些时候可能也要用到VM模板来做一些特殊的事情。 通过VM,JS可以被编译后立即执行或者编译保存下来稍后执行(JavaScript code can be compiled

  • 本文向大家介绍深入理解Nodejs Global 模块,包括了深入理解Nodejs Global 模块的使用技巧和注意事项,需要的朋友参考一下 浏览器上有自己的全局对象 window,同理, nodejs 下也有自己的全局对象 global,并且在各个模块下 都可以直接访问 global 对象。 在 nodejs 中,除了可以直接使用 V8 JavaScript 引擎中所支持的原生 JavaScr