Ошибка события Nodejs fs.createReadStream - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь прочитать данные из файла очень быстро (данные из АЦП). Преобразование начинается при открытии файла и заканчивается при закрытии. Мне нужно подождать, чтобы открыть файл еще раз, и дождаться завершения текущей конвертации.

Моя проблема в том, что когда я очень быстро открываю файл, 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 голосов
/ 27 июня 2018

Я думаю, что решил это. 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);
            })
    })
0 голосов
/ 26 июня 2018

Похоже, проблема здесь в контексте readStream - он не является локальным по отношению к обратному вызову input, означающему, что каждое сообщение будет перезаписывать ссылку на предыдущий поток.

Тот факт, что это начинает давать сбой, когда вы увеличиваете частоту сообщений, кажется мне логичным, потому что поток не имел возможности завершиться, поэтому readyFlag никогда не сбрасывается.

Исправление для этого должно буквально один лайнер, сделать поток локальной переменной

const readStream = ...
...