2016-06-28 8 views
0

CSVファイルの解析とインポートを担当するExpress.jsサーバーがあります。XHRを介したクライアントへのNode.js応答のストリーミング

リアルタイムでインポートプロセスのステータスをユーザーのブラウザに報告したいと思います。 Express.jsから

ストリーミング応答単純です:予想通りCURL経由でエンドポイントにHTTPリクエストを送信する

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

で動作します。上記の例では、2つのストリーミングされた応答 が直ちに受信され、2秒後に最後の応答が続きます。

ただし、これはブラウザ(Chrome)では該当しません。 jQuery $.ajaxとraw 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)); 
    }); 
}); 

これ以外の場合は、リアルタイム性が必要な場合はウェブソケットを使用します。あなたはあなたが期待するコミュニケーションの形を設計しなければなりません。

+0

良いアイデア。私は、リアルタイムデータプッシュ用にウェブソケットを採用することに決めました。 –

関連する問題