文件读取流中的Nodejs不定流



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

问题是,我希望这个流是不定式的:在读完最后一行之后,流应该从头开始。我的解决方案有点奏效我收到警告消息:

(节点)警告:检测到可能的EventEmitter内存泄漏。增加了11名听众。使用发射器.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('nnnnRead file stream finished. Lines counted:nnnn' + detectionCounter);
        r.removeAllListeners();
        r.destroy();
        infinStream();
    });
    return r;
};
infinStream();
return ts;

来自注释:

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

要做到这一点,递归函数是个好主意。你的方法还可以。当你不需要对数据执行不同的转换任务时,就不需要流了。简单事件可以做你想要做的事情,而且更容易理解。

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

你能做什么:

  1. 制作一个递归函数来发射事件
  2. 使用外部活动中的数据

这只是一个简单的概念,通过使用简单的事件,可以一直激发文件中的数据:

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

相关内容

  • 没有找到相关文章

最新更新