Javascript Nodejs fs.createReadStream事件错误
我正在尝试快速读取文件中的数据(来自ADC的数据)。转换在打开文件时开始,在关闭时完成。我需要等待再次打开文件,并等待当前转换完成 我的问题是,当我快速打开文件时,nodejs不会捕捉到预期的事件。有什么线索可以解决这个问题吗Javascript Nodejs fs.createReadStream事件错误,javascript,node.js,readfile,node-red,Javascript,Node.js,Readfile,Node Red,我正在尝试快速读取文件中的数据(来自ADC的数据)。转换在打开文件时开始,在关闭时完成。我需要等待再次打开文件,并等待当前转换完成 我的问题是,当我快速打开文件时,nodejs不会捕捉到预期的事件。有什么线索可以解决这个问题吗 node.on('input', function(){ readStream = fs.createReadStream(path.location,{encoding: 'utf8'}); if (readyFla
node.on('input', function(){
readStream = fs.createReadStream(path.location,{encoding: 'utf8'});
if (readyFlag == 1) {
readStream.on('data',(data) => {
data = {payload: data/1000};
node.send(data);
console.log(`data: ${data}`);
})
}
readStream.on('open', () => {
console.log("file opened");
readyFlag = 0;
})
readStream.on('close', () => {
console.log("file closed");
readyFlag = 1;
})
readStream.on('error', (err) => {
console.log(err);
})
})
最后,文件一直被打开。因此,在我看来,这里的问题似乎是
readStream
的上下文-它不是输入
回调的本地内容,这意味着每条消息都将覆盖对上一个流的引用
在我看来,当您增加消息的频率时,这一操作开始失败似乎是合乎逻辑的,因为流还没有机会完成,所以永远不会重置readyFlag
对此的修复实际上应该是一个单行程序,使流成为本地var
const readStream = ...
我想我已经解决了。readyFlag必须是输入范围的全局,否则将无法工作。我将“open”事件移动到if语句中,该语句正在检查readyFlag。这似乎解决了问题。现在系统不挂起,文件只在读取完毕并关闭之前打开的部分后才被打开 代码如下:
var readyFlag = 1;
node.on('input', function(msg){
const readStream = fs.createReadStream(path.location,{encoding: 'utf8'});
if (readyFlag == 1) {
readStream.on('data',(data) => {
data = {payload: data/1000};
node.send(data);
console.log('data read');
readyFlag = 0;
})
readStream.on('open', () => {
console.log("file opened");
})
}
readStream.on('close', () => {
console.log("file closed");
readyFlag = 1;
})
readStream.on('error', (err) => {
console.log(err);
})
})
你到底想在这里做什么?您是否正在尝试保护文件上的多个读取?至于为什么文件保持打开状态,可能是因为您正在传递选项而没有设置
autoClose:true
-根据,它应该默认为该值,但只有在您根本不传递选项的情况下才会发生。我可以看出这有点混乱。很抱歉事实上,是的,我正在努力防止多次读取。我要确保文件已关闭,然后才能执行其他读取操作。当我在1秒内用打开和关闭文件时,我的代码可以工作。但是如果我强制它每0.1秒读取一次,它只会收到“打开”事件,而不会收到“关闭”事件。这不仅仅是因为当readyFlag
事件可以注册为readStream
时,readyFlag
将始终为0,除非它被初始化为1。此外,readyFlag
的作用域不应该与readStream
的作用域相同,因为它是该流的标志吗?谢谢。有道理!我明天就试试。请注意:我已将标志初始化为等于1。但关于范围,你是对的。明天我也会改变的。谢谢@peteb我假设,readyFlag
正在其他地方初始化,否则它根本不起作用。。。我认为,readyFlag
需要在全局范围内,因为传入的每条消息都需要脱离该状态。我不确定我是否同意这一点-你是说如果你不将readStream
设为本地变量,这就行得通吗?我不明白为什么要将readStream.on('open',…)
移动到中,如果它本身会在这里产生任何不同,修复方法是根据我的回答,使readStream
成为一个局部变量。嗨@James,我已经为此工作了一整天。不幸的是,我的解决方案没有如预期的那样奏效。当然不是!一般来说,我对JavaScript和node.js都是相当陌生的,所以我不太了解。。我现在明白了,readyFlag在这个上下文中没有任何作用,因为if语句中的所有操作都是异步的。好。。刚刚删除了readyFlag的检查。主要的问题是,如果我使用node.send(data)对象,那么node RedFlow editor web服务将停止。如果我只在console.log上输出它,一点问题都没有听起来像Node Red崩溃了,很难说是什么原因造成的,因为另一个节点发生在节点上。send
-但是,如果文件不再保持打开状态,我觉得问题中详细描述的问题已经修复,这是本地变量的结果。