javascript - 如何设置流nodejs读取的行数限制

标签 javascript node.js stream

我正在阅读很长的 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()
});

谢谢。

最佳答案

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

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

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

关于javascript - 如何设置流nodejs读取的行数限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45829375/

相关文章:

scala - Scala Streams 中如何实现不变性?

javascript - 如何使用meteor-leaflet来整合leaflet和meteor?

css - node.js、css 验证、w3c 禁止我?

javascript - 如何在node.js javascript文件中包含json文件

javascript - 加载 ecmascript 模块(.mjs 文件)作为 Nodejs cli 的主入口

node.js - 使用 Node.js 流管道进行超时处理

javascript - 如何更改调查中问题的顺序?

javascript - 在页面上放置多个 raphael.js 对象

javascript - 我应该 "require"静态图像吗

powershell - 如何仅在 PowerShell 中的变量中捕获错误输出