通过XHR流式传输Node.js对客户端的响应

时间:2016-06-28 06:26:04

标签: javascript jquery node.js express socket.io

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

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

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

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "home/env/local/lib/python2.7/site-packages/nltk/probability.py", line 1705, in __init__
    for (cond, sample) in cond_samples:
ValueError: too many values to unpack (expected 2)

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

然而,浏览器(Chrome)并非如此。使用jQuery render() { return ( <div> // the wrapper div <div style={{height: '100%','background-color': 'gray'}}></div> </div>); } 和原始XHR调用进行测试,整个 当响应完成时,响应似乎被缓冲并立即返回。

这种通讯方式通常如何处理?我假设socket.io是一个选项,但肯定有一个更简单 如何在浏览器的XHR或XHR2功能中进行构建?

1 个答案:

答案 0 :(得分:2)

您可以向客户端返回引用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。您可以设计出您期望的沟通方式。