Node.js fs.createReadStream事件错误

时间:2018-06-26 14:05:40

标签: javascript node.js readfile node-red

我试图非常快速地从文件中读取数据(来自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);
            })




    })

我总是打开文件。

2 个答案:

答案 0 :(得分:0)

在我看来,这里的问题是readStream的上下文-它不是input回调的本地变量,这意味着每条消息都会覆盖对上一个流的引用。

当您增加消息的频率时,这开始失败的事实在我看来是合乎逻辑的,因为流还没有机会完成,所以readyFlag永远不会重置。

针对此问题的解决方法实际上应该是一个衬里,将流设为本地变量

const readStream = ...

答案 1 :(得分:0)

我想我已经解决了。 readyFlag必须对输入范围是全局的,否则它将不起作用。我将if语句内的'open'事件移到了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);
            })
    })