如何将json对象流发送到客户端?

时间:2018-12-11 07:57:54

标签: json angular express stream response

这可能是一个重复的问题,但找不到任何解决方案。我已经尝试在此快速时间内进行搜索,但是我很不幸。

我的问题是如何将json对象的 stream (如果stream是正确的术语,则为idk)发送给客户端。

示例我正在读取数据库上的数据,并且每发现5条记录,我就会将数据以json格式发送给客户端。然后使用Angular httpclient lib读取客户端上的数据。

我已经尝试过expressjs response.write(),但是直到我致电response.end(),客户端才能够接收数据。

这样做的正确方法是什么?

我正在考虑socket.io,但这太过分了。

修改

其他示例

function getData(res: Response, req: Request):void {
  for(let i = 0; i<100; i++{
    res.write(JSON.stringify({data:1}) + '\n');
  }

  res.end(); // There is data received on the browser until this was called.
}

或者类似的东西。我原以为数据会每隔1秒钟到达一次,但10秒钟后它们会同时出现。

function getData(res, req){
  const s = setInterval(()=>{
    res.write(JSON.stringify({value: 'test value'}));
  }, 1000);

  setTimeout(()=>{
    clearInterval(s);
    res.end();
  }, 10000);
}

1 个答案:

答案 0 :(得分:0)

所以我发现上面的示例代码没有问题,并且是正确的方法。

当我尝试直接向浏览器打开url API时,可以看到浏览器正在接收数据。

问题出在我用来获取数据的有角度的httpclient库上,如果所有内容都已下载,它将显示数据。

但是幸运的是我发现了这个包oboe.js,它可以完成我想要的流json数据的操作。因此,当快速js通过res.write()发送数据时,oboe将能够检索数据并准备使用。

您可以像这样简单地完成它。

oboe('your url').node('!', data=>{
  // process your data here.
  // the '!' selector means that oboe will just show the data if it is a valid json.
});