ожидание изменения логического значения в файле json в цикле

#node.js

#node.js

Вопрос:

У меня есть другая программа узла для установки значения цикла в файле конфигурации, однако, даже если значение цикла изменяется в файле, цикл просто не видит его, поэтому я в тупике

 while (true) {
    if(require('./config.json').loop) {
    moveMouse();
    console.log('looped');
  } else continue;
}
  

Комментарии:

1. Что на самом деле изменяет .loop свойство в файле JSON? Если это код в этом же node.js процесс, тогда этого никогда не произойдет, потому что while(true) блокирует и никогда не позволяет запускать что-либо еще. Также require() кэшируются модули, поэтому вы всегда получаете один и тот же кешированный config.json каждый раз. Вы могли бы использовать fs.readFile() и затем JSON.parse() , но у вас все равно была бы проблема с блокировкой цикла.

Ответ №1:

Это потому, что требуется кэшировать модуль. Лучше использовать read file и не использовать require для чтения файлов.

Если вы все еще хотите использовать require, вы все равно можете удалить кеш перед следующим require :

 while (true) {
    // delete cached module before require again
    delete require.cache[require.resolve('./config.json')]
    if(require('./config.json').loop) {
       moveMouse();
       console.log('looped');
      } else continue;
}
  

Комментарии:

1. Примечание: это приведет к «зависанию» node.js обрабатывайте до тех пор, пока не обнаружите, что .loop свойство изменилось на значение true, потому что while цикл блокируется, и циклу событий не предоставляется возможность сделать что-либо еще.

2. Да, это правда. Никогда не используйте while (true) в рабочей среде.

3. Если только это не в async функции, которую вы используете await . Это единственное место, while(true) которое иногда может быть в порядке. Кроме того, если это код браузера, который moveMouse() подразумевает, то это также приведет к зависанию браузера.

4. это, по-видимому, выдало config.json: Unexpected end of JSON input , как только переменная цикла была изменена на true

5. Подтвердите свой json после изменения переменной. Вы можете использовать любой инструмент в Google. или вы можете поделиться json с нами.

Ответ №2:

Как насчет использования файла наблюдения узла?

watcher.js

 const  { watchFile, readFile, readFileSync } = require('fs')

const file = readFileSync('./config.json')
const originalConfig = JSON.parse(file.toString())

let prevValue = originalConfig.value

watchFile('./config.json', (curr, prev) => {
  const currTime = new Date(curr.mtime).getTime()
  const prevTime = new Date(prev.mtime).getTime()

  const hasChanged = currTime !== prevTime
  
  if (hasChanged) {
    readFile('./config.json', (err, data) => {
      const config = JSON.parse(data.toString())
      const value = config.value
      
      console.log('value was:', prevValue)
      console.log('value is now', value)

      prevValue = value
    })
  }
})
  

config.json

 {
  "value": false
}
  

Здесь код

  1. считывает config.json
  2. анализирует его как json
  3. Считывает свойство ‘value’, которое имеет логическое значение
  4. Просматривает файл
  5. Когда временная метка изменилась, мы знаем, что кто-то изменил файл json
  6. Мы снова читаем файл (поскольку он изменился)
  7. Проанализируйте его и прочитайте значения