javascript - 通过 XHR 对客户端进行流式处理 Node.js 响应

标签 javascript jquery node.js express socket.io

我有一个 Express.js 服务器,其路由负责解析和导入 CSV 文件。

我想将导入过程的状态实时反馈给用户的浏览器。

来自 Express.js 的流式响应非常简单:

router.get( '/test', function( _req, _res, _next ) {
    _res.write( 'File import initiated.' );

    // ... processing CSV in loop

    _res.write( 'Processing row x.' );

    // artificial delay to simulate some i/o
    setTimeout( function() {
        _res.write( 'File import completed successfully.' );
        _res.end();
    }, 2000 )
} );

通过 CURL 向端点发送 HTTP 请求按预期工作。在上面的示例中,两个流式响应 立即收到,然后在两秒后收到最终响应。

然而,在浏览器 (Chrome) 中情况并非如此。 使用 jQuery $.ajax 和原始 XHR 调用进行测试,整个 响应似乎被缓冲并在响应完成时立即返回。

通常如何处理这种类型的通信?我假设 socket.io 是一个选项,但肯定有一个更简单的 如何使用浏览器的内置 XHR 或 XHR2 功能?

最佳答案

您可以将引用 ID 返回给客户端,客户端调用正确的 http api 来收集该 csv 处理请求的状态。您可能需要一些后端支持来启用它。类似于数据库中的某些表可以跟踪此状态。

router.get( '/test', function( _req, _res, _next ) {
    SaveFile(_res.file).then(function(id) {
        _res.end(JSON.stringify({id: id});
    });
});

router.get( '/status', function( _req, _res, _next ) {
    GetStatus(_res.params.id).then(function(status) {
        _res.end(JSON.stringify(status));
    });
});

否则,如果您仍然想要实时,请使用 websockets。您必须设计您期望的交流形式。

关于javascript - 通过 XHR 对客户端进行流式处理 Node.js 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38068546/

相关文章:

Javascript:变量中的 MYSQL 查询

javascript - 单击似乎没有触发

javascript - 如何通过单击另一个类元素获取类的当前 html 值

javascript - 可拖动 - 如何限制可拖动元素越过屏幕底部?

javascript - Redis连接关闭

javascript - 通过 css/javascript 对 Angular 图像叠加

javascript - 设置鼠标悬停背景颜色为无

javascript - jQuery。等待模态 Bootstrap 中的输入值

ruby - 是否有处理跨框架身份验证的标准方法?

javascript - 编写适用于客户端 javascript 和服务器端 NodeJs 模块的 javascript 代码