2016-06-28 70 views
0

我有一個負責解析和導入CSV文件的路由的Express.js服務器。Streaming Node.js通過XHR對客戶端的響應

我想將導入過程的狀態實時回報給用戶的瀏覽器。

從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) 
}); 

發送HTTP請求到端點通過捲曲按預期工作。在上述示例中,立即收到兩個流式響應 ,然後在兩秒鐘後收到最終響應。

但是,瀏覽器(Chrome)並非如此。使用jQuery $.ajax和一個原始XHR調用進行測試,整個 響應似乎被緩存,並在響應完成時一次全部返回。

這種類型的通信通常如何處理?我認爲socket.io是一個選項,但肯定有一個簡單的方法來縮小瀏覽器的構建int XHR或XHR2功能嗎?

+1

不要相信目前可以使用'XHR'單獨使用單個請求的過程,但應該可以使用多個請求。請參閱http://stackoverflow.com/questions/35899536/method-for-streaming-data-from-browser-to-server-via-http/。 – guest271314

+0

參見https://github.com/yutakahirano/fetch-with-streams/issues/30。您可以從服務器請求,直到收到文件的總字節數,然後重新組裝文件客戶端。 – guest271314

+0

https://jakearchibald.com/2016/streams-ftw/#streams-the-fetch-api,http://jsbin.com/vuqasa/edit?js,console – guest271314

回答

1

您可以將引用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。你必須設計你期望的溝通形式。

+0

好主意。我決定採用websockets來實時推送數據。 –