显示服务器端运行的长进程的状态

Jum*_*awa 3 ajax node.js

我正在基于 Node.js 的 Web 应用程序中进行 CSV 导入。大多数给定的 CSV 文件都有数万条记录,并且需要几分钟的时间。

因此,在导入完成之前,我想向用户显示“当前正在导入...”消息。

我想要创建的内容类似于 Github 的分叉屏幕。按存储库右上角的分叉按钮后,它会显示消息“分叉/应该只需要几秒钟”。直到 fork 完成。此外,我想添加进度条来指示已处理记录的百分比。

目前我的实现是:

  1. 客户端发送带有 CSV 数据的请求
  2. 服务器处理接收到的 CSV 并将记录插入数据库。
  3. 如果 CSV 有效,服务器响应 200。

但实施后用户无法看到当前状态。甚至有时候socket会挂掉。

我正在考虑以下重新实现:

  1. 客户端发送带有 CSV 数据的请求
  2. 服务器响应 200 告诉客户端已收到 CSV
  3. 服务器开始处理收到的 CSV 并将记录插入数据库。

但是,我不知道:

  1. 客户如何知道导入已完成
  2. 客户端如何知道 CSV 处理和 DB 插入何时发生错误

服务器端如何实现?提前致谢 ;)

Sal*_*man 5

您需要使用socket.io此处来跟踪进度。一旦您收到 CSV,您的客户端就可以连接到套接字。

服务器:

io.on('connection', function (socket) {
    console.log('CONNECTED');
    socket.join('progressSession');
});
Run Code Online (Sandbox Code Playgroud)

您可以定期发出progress事件,让客户端知道您已处理了多少条记录。(我希望您异步处理记录,或者至少可以在两者之间运行一些其他代码)

io.sockets.in('progressSession').emit('progress', noOfRecords);
Run Code Online (Sandbox Code Playgroud)

并且,客户端可以监听progress事件并将其显示给用户

var socket = io.connect('http://localhost:9000');
socket.on('progress' , function (status){
    console.log(status);
    // show status to the user
});
Run Code Online (Sandbox Code Playgroud)

如果需要更清晰的说明,请发表评论。