Javascript Nodejs fs.createReadStream事件错误

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

我正在尝试快速读取文件中的数据(来自ADC的数据)。转换在打开文件时开始,在关闭时完成。我需要等待再次打开文件,并等待当前转换完成

我的问题是,当我快速打开文件时,nodejs不会捕捉到预期的事件。有什么线索可以解决这个问题吗

 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
-但是,如果文件不再保持打开状态,我觉得问题中详细描述的问题已经修复,这是本地变量的结果。