簡體   English   中英

如何從Node.js服務器流到客戶端

[英]how to stream from nodejs server to client

我目前正在嘗試發送一個非常長的csv文件,該文件將在瀏覽器中處理。

我想將其流式傳輸到客戶端,因為它將超出字符串大小限制,並且還會占用服務器中過多的內存。

我努力了

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中按緩沖區接收流緩沖區,以便在流進來時處理流,例如將它們放入表中。 我怎樣才能做到這一點?

首先,您不想在同一請求中調用render ,而是希望將數據通過管道傳遞到響應中。 你想把它們分開

  1. 渲染頁面
  2. 啟動流請求

要呈現頁面,只需將默認路由發送到頁面HTML

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

然后進行流傳輸,在服務器端調整您的代碼,例如

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頁面上,加載(或掛斷按鈕),觸發AJAX請求以拉下CSV數據,例如使用jQuery

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM