2017-08-22 5 views
0

Ich versuche derzeit, eine sehr lange CSV-Datei zu senden, die im Browser verarbeitet wird.wie von Nodejs Server zum Client streamen

Ich möchte es an den Client streamen, da es die Größe der Zeichenfolge überschreiten würde und auch zu viel Speicher auf dem Server aufnehmen würde.

Ich habe

versucht
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'] 
     }) 
    }) 
}); 

Wenn ich die oben tun, es Strom an den Client gelesen sendet, aber es macht auf der Seite, die nicht das, was ich will. Ich möchte in der Lage sein, Stream-Puffer durch Puffer in der Client-Javascript zu erhalten, um den Stream zu verarbeiten, wie sie z. leg sie in einen Tisch. Wie kann ich das machen?

Antwort

2

Nun, erstens möchten Sie nicht render in der gleichen Anfrage anrufen, die Sie suchen, um Daten in die Antwort zu leiten. Sie würden wollen diese

  1. die Seite
  2. Render aufzuschlüsseln
  3. die Anfrage Stream starten

zum Rendern der Seite, nur Ihre Standard-Route

app.get('/', (req, res) => { 
    res.render('./test/test', { 
     css: ['test/test.css'], 
     js: ['test/test.js'] 
    }); 
}); 
die Seite HTML herabs haben

Dann zu streamen, auf der Server-Seite zwicken Sie Ihren Code wie

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

Dann auf Ihrem Client, in Ihrer Standard-HTML-Seite, entweder beim Laden (oder Haken bis zu einer Taste drücken), eine AJAX-Anfrage, um die CSV-Daten z. mit jQuery

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

Nur eine Frage. Wenn Sie auf Daten in der jquery Callback-Funktion zugreifen, greift es auf die gesamte Variable oder Chunk für Chunk zu? – forJ

+0

@Serendipity Nein, es ist nicht, wenn das der gewünschte Effekt ist, dann müssen Sie rohe XHR-Anfrage verwenden - [siehe Beispiel] (https://Stackoverflow.com/a/12280916/82586) – James

+0

@James nette Antwort! –

Verwandte Themen