Node.js 在处理大数据期间显示进度

Node.js 在处理大数据期间显示进度,node.js,socket.io,Node.js,Socket.io,我有一个问题,我有一个web应用程序要运行,需要处理一些大文件。这可能需要5秒钟,所以在此期间,我想向用户显示该文件正在处理中,或者最好是发送信息多少时间结束。这是第一页,我不能发送两次res.render,那么如何做到这一点 var fileinarray = require('./readfile'); app.get('/', function(req, res){ var dataready = fileinarray; res.render('index',

我有一个问题,我有一个web应用程序要运行,需要处理一些大文件。这可能需要5秒钟,所以在此期间,我想向用户显示该文件正在处理中,或者最好是发送信息多少时间结束。这是第一页,我不能发送两次res.render,那么如何做到这一点

 var fileinarray = require('./readfile');

 app.get('/', function(req, res){
     var dataready = fileinarray; 
     res.render('index', {data: dataready});
 });
那我该怎么做呢?我读了一些关于socke.io的书,但我现在不知道如何在我的案例中使用

感谢您的帮助

如果您正在加载一个带有此请求的页面(看起来像),那么您将无法按其结构方式显示进度,因为浏览器正在等待下载您的页面,因此在您呈现页面之前无法在该窗口中显示任何内容。但是,您希望在页面到达之前显示进度

因此,你必须调整工作方式。首先,为了显示进度,浏览器必须有一个可以显示进度的工作页面。这意味着浏览器不能等待页面到达。我能想到的最直接的方法是,首先呈现一个shell页面,服务器立即返回该页面(无需等待原始内容)。在该shell页面中,您有代码来显示进度,并向服务器发出请求以获取长时间运行的数据。使用Ajax和webSockets有几种方法可以实现这一点。我将概述一些组合:

全部使用Ajax

  • 浏览器请求/页,服务器呈现shell页
  • 同时,在呈现页面之后,服务器开始获取所需数据的长时间运行过程
  • 在shell页面中呈现的是一个包含事务ID的Javascript变量
  • 同时,客户端Javascript可以定期向服务器发送Ajax请求,以检查给定事务id的进度(比如每10秒一次)。服务器返回任何有用的进度信息,客户端Javascript显示进度信息
  • 在某个时刻,服务器处理完数据和一个常规Ajax请求,该请求检查所有数据的进度返回。然后,客户端Javascript将该数据插入当前页面,操作完成
  • 主要使用WebSocket

  • 浏览器请求/页,服务器呈现shell页
  • shell页面中的客户端代码与服务器建立webSocket或socket.io连接,并发送一个初始请求以获取属于此页面的数据
  • 服务器接收webSocket连接和数据的初始请求,并启动长时间运行的数据获取过程
  • 由于服务器具有有意义的进度信息,它会通过webSocket/socket.io连接将该信息发送给客户端,当客户端收到该信息时,它会在页面中呈现适当的进度
  • 在某个时刻,服务器获取数据并向客户端发送一条包含最终数据的消息。客户端Javascript接收该数据并将其插入页面
  • 然后,客户端可以关闭webSocket/socket.io连接

  • 很抱歉,但是如何使用节点在客户端呈现shell页面?我在node?@cyprian中找不到如何执行此操作的任何信息-在您在问题中显示的
    app.get()
    中,您在那里呈现shell页面。然后,您使用shell页面中的客户端Javascript获取实际内容(使用我概述的任何一种方法),显示进度,然后将最终内容插入shell页面。好的,现在我明白了。我认为websocket将是我网站上最好的,因为我几乎所有的内容都取决于接收到的数据。使用socket,我可以轻松地发送部分数据并动态创建内容。又是Thx