[英]Nodejs infinitive stream from file read stream
我在尝试完成平庸的任务时遇到了麻烦。 我需要从输入txt文件创建nodejs可读流。 我需要对此流执行一些转换(为每行创建JSON对象)。
问题是我希望此流是不定式的:在读取最后一行之后,流应从头开始。 我的解决方案有效,但我收到警告消息:
(节点)警告:检测到可能的EventEmitter内存泄漏。 添加了11个侦听器。 使用generator.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小时处于活动状态的服务器,并将始终模拟设备输出。
为此,递归函数是一个好主意。 您采用的方法是可以的。 当您不需要数据上的其他转换任务时,实际上就不需要流。 简单事件可以完全满足您的需求,并且更易于理解。
代码中的错误就是放置侦听器的关键所在。 监听器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
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.