Nodejs来自文件读取流的不定式流

时间:2015-12-08 12:44:45

标签: javascript node.js stream

我正面临着试图完成相当平庸任务的麻烦。我需要从输入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;

1 个答案:

答案 0 :(得分:0)

来自评论:

  

我需要服务器24小时/天,并将模拟设备   一直输出。

要做到这一点,递归函数是个好主意。你做的方法还可以。当您不需要对数据执行不同的转换任务时,实际上并不需要流。简单事件可以完全按照您的要求执行,并且更容易理解。

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

你能做什么:

  1. 制作一个发出事件的递归函数
  2. 使用您外面活动的数据
  3. 这只是一个简单的概念,它使用简单的事件,这些事件会一直触发文件中的数据:

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