Javascript 如何设置流节点读取的行数限制

Javascript 如何设置流节点读取的行数限制,javascript,node.js,stream,Javascript,Node.js,Stream,我正在阅读一个长长的csv文本并将其流式传输到客户端。我需要能够确保传递给客户机的每个流都有某种与之相关联的换行标记。问题是,当我传输数据时,它会剥离换行符。是否有一种方法可以确保断线不会被剥离,或者被一些字符替换,我可以在客户端“while”流媒体上识别为断线 此外,也不能保证流中的每个缓冲区总是在换行点结束(例如,如果我有以下数据) 10,20,30 40,50,60 下一个缓冲区可以从50开始,而不是从40开始。我如何知道每个缓冲区应该连接断行还是不连接断行 服务器端 app.get('

我正在阅读一个长长的csv文本并将其流式传输到客户端。我需要能够确保传递给客户机的每个流都有某种与之相关联的换行标记。问题是,当我传输数据时,它会剥离换行符。是否有一种方法可以确保断线不会被剥离,或者被一些字符替换,我可以在客户端“while”流媒体上识别为断线

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

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

谢谢。

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

非常简单的解决方案将使用内置节点模块“readline”,它允许我们逐行读取流数据。我添加了下面的工作代码片段来说明这一点

stream_server.js

stream_client.js

希望这能解决你的问题

我保留了与我对问题的初步理解相关的上述部分,修改了问题的措辞,看起来您在服务器响应中向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());
});

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

非常简单的解决方案将使用内置节点模块“readline”,它允许我们逐行读取流数据。我添加了下面的工作代码片段来说明这一点

stream_server.js

stream_client.js

希望这能解决你的问题

我保留了与我对问题的初步理解相关的上述部分,修改了问题的措辞,看起来您在服务器响应中向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
每次都会收到一大块行,我已经更新了我的问题来说明我的问题。我已经在一行一行地给回复写信了,我期待着和你一样的行为。然而,显然,即使我逐行流式传输,
xhr
一次接收一大块行
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());
});