我有一个 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/