#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
, как только переменная цикла была изменена на true5. Подтвердите свой 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
}
Здесь код
- считывает config.json
- анализирует его как json
- Считывает свойство ‘value’, которое имеет логическое значение
- Просматривает файл
- Когда временная метка изменилась, мы знаем, что кто-то изменил файл json
- Мы снова читаем файл (поскольку он изменился)
- Проанализируйте его и прочитайте значения