Javascript 如何从ExpressJS流式传输JSON对象?

Javascript 如何从ExpressJS流式传输JSON对象?,javascript,node.js,json,express,Javascript,Node.js,Json,Express,我正在尝试将JSON对象从ExpressJS/Node后端API流式传输到前端站点 由于各种原因,我不想使用Sockets.IO。据我所知,本机流媒体库应该支持流媒体对象,而just Express似乎使这一点更加复杂 我的前端代码直接缝合。我使用Fetch获取目标URL,从响应对象获取读取流,并将该读取流设置为objectMode:true 前端示例: async function () { let url = "myurl"; let

我正在尝试将JSON对象从ExpressJS/Node后端API流式传输到前端站点

由于各种原因,我不想使用Sockets.IO。据我所知,本机流媒体库应该支持流媒体对象,而just Express似乎使这一点更加复杂

我的前端代码直接缝合。我使用Fetch获取目标URL,从响应对象获取读取流,并将该读取流设置为objectMode:true

前端示例:

    async function () {

      let url = "myurl";

      let response = await fetch( url, {
        method: 'GET',
        mode: 'cors',
        wtihCredentials: 'include'
      }

      const reader = response.body.getReader({objectMode: true });

      // Where things are a bit ambiguous
      let x = true;
      while (x) {
        const {done, value} = reader.read()
        if (done) { break; }

        // do something with value ( I push it to an array )

      }      
}
后端Bode示例(由于无法将流更改为objectMode而失败)

现在我的问题是,似乎无论如何都没有办法将ExpressJS写入流更改为objectMode:true。令我沮丧的是,ExpressJS文档甚至没有确认响应对象上是否存在write()函数:

如何将其转换为objectMode:true

相反,我尝试将writeStream作为字符串使用。我遇到的问题是,当发送缓冲区填满时,它是通过字符而不是对象来完成的。这意味着在某个时刻,无效的JSON被传递给请求者

我经常遇到的一个建议解决方案是,我可以读取客户机上的所有块并组装有效的JSON。这违背了流媒体的目的,所以我试图找到一个更好的方法

对于我认为是相同的问题,我无法找出如何从express代码直接与write stream对象对话,因此我无法使用本机writeStream操作writable.length来手动检查整个JSON对象是否有作为字符串的空间。这使我无法将字符串化JSON与新行终止符一起使用


有人能帮我澄清一下吗?我正在处理Mongo数据库中的100k+记录,我真的需要特定的页面加载才能工作,这样用户就可以开始挑选数据了。

我不知道这是否可行,但我想这样做是个坏主意,而不是使用web套接字,io很容易实现,并与expressjs集成。与一个请求相关的所有数据都在单个响应对象中发送到客户端。由于JSON对象太大,无法使用套接字,所以我建议您从客户端发送多个AJAX请求。您可以决定响应单个AJAX请求发送多少数据。由于请求是AJAX(或者您可以使用任何其他相同类型的请求),网页将不会重新加载,前端将接收数据,就好像它是以流的形式出现一样。因为您的记录是100k+的,所以最好及时发送AJAX请求。与10个请求一样,在前10个请求的响应之后10个请求。答案将取决于API是否使用有效的JSON进行响应,或者您是否同时控制FE和BE,并且唯一的目标是以最小的计算开销来流式传输数据?就我个人而言,我建议遵守JSON标准。我不知道这是否可行,但我想这样做是个坏主意,而是使用web套接字,socket.io非常容易实现并与expressjs集成。与一个请求相关的所有数据都在单个响应对象中发送到客户端。由于JSON对象太大,无法使用套接字,所以我建议您从客户端发送多个AJAX请求。您可以决定响应单个AJAX请求发送多少数据。由于请求是AJAX(或者您可以使用任何其他相同类型的请求),网页将不会重新加载,前端将接收数据,就好像它是以流的形式出现一样。因为您的记录是100k+的,所以最好及时发送AJAX请求。与10个请求一样,在前10个请求的响应之后10个请求。答案将取决于API是否使用有效的JSON进行响应,或者您是否同时控制FE和BE,并且唯一的目标是以最小的计算开销来流式传输数据?就个人而言,我建议遵守JSON标准。
router.get('/', (request, response) => {

  response.writeHead(200, { 'Content-Type' : 'application/json' });

  MongoDB.connection.db.collection('myCollection').find({}).forEach( (i) => {
    response.write(i);
  }).then( () => {
    response.end()
  })
})