【问题标题】:How to set limits on the number of lines read by stream nodejs如何设置流nodejs读取的行数限制
【发布时间】:2017-08-23 01:43:58
【问题描述】:

我正在阅读长 csv 文本并流式传输到客户端。我需要能够确保传递给客户端的每个流都有某种与之关联的换行标记。问题是当我流式传输数据时,它会去除换行符。有没有一种方法可以确保不会删除换行符,或者将其替换为一些我可以在客户端“同时”流式传输时识别为换行符的字符?

此外,不能保证流中的每个缓冲区总是在换行点处结束,例如,如果我有以下数据

10,20,30
40,50,60

下一个缓冲区可能从 50 而不是 40 开始。我如何知道每个缓冲区应该连接或不连接换行符?

服务器端

app.get('/test/api', (req, res) => {
    let stream = fs.createReadStream('./resources/onescsv.csv');
    stream = byline.createStream(stream);
    stream.on('data', (data)=>{
        // console.log(data.toString());
        res.write(data + '||||')
    });
    // stream.pipe(res);
    stream.on('end', () => res.end());

});

客户端

let count = 0;
    $(document).ready(()=>{
        let lastOfPrevious;
        let firstOfCurrent;
        let xhr = new XMLHttpRequest();
        xhr.open('GET', '/test/api', true);
        xhr.onprogress = function (){
            console.log('line count');
            let incomingBuffer = xhr.responseText;
            console.log(incomingbuffer)
    };
    xhr.send()
});

谢谢。

【问题讨论】:

标签: javascript node.js stream


【解决方案1】:

我相信您正在将一个非常大的 csv 数据从您的服务器流式传输到客户端,而在客户端您无法找出流式传输的 csv 数据中的换行符。

非常容易使用内置节点模块“readline”,它允许我们逐行读取流数据。我在下面添加了工作代码 sn-p 来说明这一点。

stream_server.js

const http = require('http');
const fs = require('fs');
var server = http.createServer(function (req, res) {
    let stream = fs.createReadStream(__dirname + '/tmp.csv');
    stream.pipe(res);
});
server.listen(8000)

stream_client.js

const fs = require('fs');
const http = require('http');
const readline = require('readline');

var options = {
    host: 'localhost',
    port: 8000
  };

http.get(options, function(res) {
    console.log(`Got response:  ${res.statusCode}`);
    let readStream = readline.createInterface({
        input: res,
        output: process.stdout,
        terminal: false
    });
    readStream.on('line', function(line) {
        console.log(`Reading -->  ${line}`);
    });

}).on('error', function(e) {
    console.log(`Got error  ${e.message}`);
});

希望这能解决您的问题..

我保留了与我对问题的初步理解有关的上述部分,修改后的问题措辞看起来像是您在服务器响应中为 csv 的每一行添加分隔符。

如果你定义你的快速路线如下,它将为你的 csv 文件的每一行添加分隔符

app.get('/test/api', (req, res) => {
    let stream = fs.createReadStream('./tmp.csv');
    let readStream = readline.createInterface({
        input: stream,
        output: process.stdout,
        terminal: false
    });
    readStream.on('line', function(line) {
        console.log(`Reading -->  ${line}`);
        res.write(line + ' |||| ')
    });
    stream.on('end', () => res.end());
});

【讨论】:

  • 我更新了我的问题来说明我的问题。我已经逐行写信给回复,并且预期的行为与您相同。但是,显然,即使我逐行流式传输,xhr 也会一次接收大量行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 2020-12-24
相关资源
最近更新 更多