我正面临着试图完成相当平庸任务的麻烦。我需要从输入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;
答案 0 :(得分:0)
来自评论:
我需要服务器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
});