Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs文件读取流中的不定式流_Javascript_Node.js_Stream - Fatal编程技术网

Javascript Nodejs文件读取流中的不定式流

Javascript Nodejs文件读取流中的不定式流,javascript,node.js,stream,Javascript,Node.js,Stream,我在努力完成一项相当平庸的任务时遇到了麻烦。我需要从输入txt文件创建nodejs可读流。我需要在此流上执行一些转换(为每行创建JSON对象) 问题是我希望这个流是不定式的:在读取最后一行之后,流应该从开头开始。我的解决方案工作正常我收到警告信息: (节点)警告:检测到可能的EventEmitter内存泄漏。添加了11个漏侦听器。使用emitter.setMaxListeners()增加限制 我希望找到简单的解决方案,而无需直接读取和缓冲文件 //Transform stream object

我在努力完成一项相当平庸的任务时遇到了麻烦。我需要从输入txt文件创建nodejs可读流。我需要在此流上执行一些转换(为每行创建JSON对象)

问题是我希望这个流是不定式的:在读取最后一行之后,流应该从开头开始。我的解决方案工作正常我收到警告信息:

(节点)警告:检测到可能的EventEmitter内存泄漏。添加了11个漏侦听器。使用emitter.setMaxListeners()增加限制

我希望找到简单的解决方案,而无需直接读取和缓冲文件

//Transform stream object
var TransformStream = function () {
    Transform.call(this, {objectMode: true});
};
util.inherits(TransformStream, Transform);

TransformStream.prototype._transform = onTransform;
TransformStream.prototype._flush = onEnd;

var ts = new TransformStream();

var infinStream = function () {
    var r = fs.createReadStream(filePath);
    r.pipe(split(), {end: false})
        .pipe(ts, {end: false});
    r.once('end', function () {
        //console.log('\n\n\n\nRead file stream finished. Lines counted:\n\n\n\n' + detectionCounter);
        r.removeAllListeners();
        r.destroy();
        infinStream();
    });
    return r;
};
infinStream();

return ts;
从评论中:


我需要的服务器将是24小时/天的生活,并将模拟设备 始终输出

为此,递归函数是一个好主意。你采取的方法是可以的。当您不需要对数据执行不同的转换任务时,实际上并不需要流。简单的事件可以做你想做的事情,而且更容易理解

代码中的错误是您放置侦听器的位置。listenster
r.once
在递归函数中。在函数中定义r,因此每次函数调用都会创建一个新的r。正因为如此,r.once不能像您所期望的那样工作

您可以做什么:

  • 生成一个发出事件的递归函数
  • 使用外部事件中的数据
  • 这只是一个简单的概念,使用简单的事件,这些事件会一直激发文件中的数据:

    // Your recursive function
    var simulateDeviceEvents = function(){
      fs.readFile('device.txt', function (err, data) {
        if (err) throw err;
        // Just emit the event here
        Emitter.emit('deviceEvent', data);
      });
      //If this happens to fast you could also call it with
      //a timeout.
      simulateDeviceEvents();
    };
    
    // Start the function
    simulateDeviceEvents();
    //IMPORTANT: The listener must be defined outside your function!
    Emitter.on('deviceEvent', function(data){
       // Do something with your data here
    });
    

    如果你有一个文件,它不是无限大的,那么总会有一个结尾。但你为什么想要一个循环。你对返回的数据有什么要求?当没有答案时,这意味着我完全遗漏了一些东西。我有设备输出保存在txt文件。我想要得到的是模拟设备输出的服务器——这意味着它将从文件中流式传输数据,直到中断为止。为什么要使用循环文件流来模拟设备输出?设备输出也不是无限大。我还认为你在这里遗漏了一些东西。我不明白你想做什么,但我非常确定这个解决方案不是一个无限大的文件流。我需要一个24小时/天的服务器,并将一直模拟设备输出。无论设备输出有多大,我都需要使其不定式。我想到的最简单的解决方案是导出无限流的模块。我想知道是否存在更聪明的解决方案。谢谢你的努力。不幸的是,你的解决方案不适合我想要实现的目标。无法使用fs.readFile,因为整个过程的要点是逐块读取文件(文件太大,无法存放在内存中),并将其作为单个流进行处理,而不会对块组成等进行摸索。。。我喜欢使用自定义事件发射器的方法,但即使是这样,这个递归函数也需要是EventEmmiter,这是我在fs.createReadStream中已经使用过的。