如何从nodejs服务器流式传输到客户端

时间:2017-08-22 08:46:12

标签: javascript node.js stream

我目前正在尝试发送一个非常长的csv文件,该文件将在浏览器中处理。

我想将它流式传输到客户端,因为它会超出字符串大小限制,并且还会在服务器中占用太多内存。

我试过了

d3.select(options.element)

当我执行上述操作时,它会将读取流发送到客户端,但它会呈现给我不想要的页面。我希望能够通过客户端javascript中的缓冲区接收流缓冲区,以便在它们进入时处理流。把它们放在一张桌子里。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

首先,您不希望在同一个请求中调用render,希望将数据传输到响应中。你想把它们拆分出来

  1. 渲染页面
  2. 启动信息流请求
  3. 要呈现页面,只需让您的默认路由向下发送页面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
    });