2017-08-22 4 views
0

現在、ブラウザで処理される非常に長いcsvファイルを送信しようとしています。nodejsサーバーからクライアントにストリームする方法

文字列サイズ制限を超えてサーバーにあまりにも多くのメモリを占有するため、クライアントにストリームしたいと考えています。

私は上記を行うと、それはクライアントに読み出されたストリームを送信しますが、それは私が欲しいものではありませんページをレンダリングします。

app.get('/test', (req, res)=>{ 
    let csvStream = byline(fs.createReadStream('./resources/onescsv.csv')); 

    csvStream.on('data', (line)=>{ 
     csvStream.pipe(res); 
    }); 

    csvStream.on('end',() => { 
     res.render('./test/test', { 
      css:['test/test.css'], 
      js:['test/test.js'] 
     }) 
    }) 
}); 

を試してみました私はクライアントのjavascriptのバッファによってストリームバッファを受け取って、ストリームが来るときにそれを処理できるようにしたいと思います。それらをテーブルに入れる。これどうやってするの?

答えて

2

まず、同じ要求でrenderを呼び出して、データを応答にパイプすることは望ましくありません。あなたは

  1. は自分のデフォルトルートは、ページのHTML

    app.get('/', (req, res) => { 
        res.render('./test/test', { 
         css: ['test/test.css'], 
         js: ['test/test.js'] 
        }); 
    }); 
    
    を下に送ってきた、
  2. スタートにページをレンダリングするために、ストリーム要求

をページをレンダリングこれらを分割したいと思います

その後、サーバー側でコードを微調整して

app.get('/api/csv', (req, res) => { 
    let stream = fs.createReadStream('./resources/onescsv.csv'); 
    stream = byline.createStream(stream); 
    stream.pipe(res); 
    stream.on('end', res.end); 
}); 

クライアントで、デフォルトのHTMLページで、読み込んだり(またはボタンを押すまで)、CSVデータをプルダウンするAJAXリクエストを発します。 jQueryを使用します。

$.get('/api/csv', data => { 
    // do something with CSV data 
}); 
+0

ただ1つの質問です。 jqueryのコールバック関数でデータにアクセスすると、変数またはチャンク全体がチャンクによってアクセスされますか? – forJ

+0

@serendipityいいえ、それが望ましい影響であれば、生のXHRリクエストを使用する必要があります - [例を参照](https://stackoverflow.com/a/12280916/82586) – James

+0

@James nice answer! –

関連する問題