【问题标题】:Show status of long process running on server side显示在服务器端运行的长进程的状态
【发布时间】:2015-10-30 15:16:52
【问题描述】:

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

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

我要创建的类似于 Github 的分叉屏幕。按下 repo 右上角的 fork 按钮后,会显示“Forking / It should only take a few seconds”的消息。直到分叉完成。 另外,我想添加进度条来显示处理记录的百分比。

目前我的实现是:

  1. 客户端使用 CSV 数据发送请求
  2. 服务器进程收到 CSV 并将记录插入数据库。
  3. 如果 CSV 有效,服务器会响应 200。

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

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

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

但是,我不知道:

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

如何实现服务器端? 在此先感谢 ;)

【问题讨论】:

    标签: ajax node.js


    【解决方案1】:

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

    服务器:

    io.on('connection', function (socket) {
        console.log('CONNECTED');
        socket.join('progressSession');
    });
    

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

    io.sockets.in('progressSession').emit('progress', noOfRecords);
    

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

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

    如果需要更清楚,请发表评论。

    【讨论】:

      【解决方案2】:

      按照您的方式发送请求,立即返回状态以确认或拒绝 CSV 有效性并完成响应。然后使用 http://socket.io/ 之类的东西向客户端发送更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-19
        • 2015-02-14
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多