Файловая система NodeJS Наблюдайте за броском события дважды или чаще

Я просматриваю файлы конфигурации моего сервера NodeJS в Ubuntu, используя:

for( var index in cfgFiles ) {
    fs.watch(cfgFiles[index], function(event, fileName) {
        logger.info("======> EVENT: " + event);
        updateConfigData(fileName);
    });
}

Поэтому всякий раз, когда я сохраняю файл конфигурации, событие «изменение» принимается как минимум дважды функцией обработчика для одного и того же имени файла, что приводит к многократному выполнению updateConfigData(). Я столкнулся с таким же поведением при просмотре файлов конфигурации с помощью C++/iNotify.

Кто-нибудь знает, что вызывает такое поведение?


person Rip-Off    schedule 18.06.2012    source источник
comment
Не могли бы вы проверить ситуацию? Ваша проблема такая же, как у меня, как я объяснил ниже? Пожалуйста, дайте мне знать, оставив комментарий, если вам нужны какие-либо разъяснения в моем ответе.   -  person hasanyasin    schedule 05.07.2012
comment
Разве мой ответ не решил вашу проблему?   -  person hasanyasin    schedule 09.07.2012
comment
Извините, хасаньясин, я очень занят другим проектом, но обязательно вернусь к этому.   -  person Rip-Off    schedule 09.07.2012


Ответы (2)


Короткий ответ: это не Node, файл действительно изменен дважды.

Длинный ответ

У меня очень похожий подход, который я использую для своей настройки разработки. Мой менеджерский процесс просматривает все исходные файлы js, если это машина для разработки, и перезапускает дочерние элементы в кластере.

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

Я редактирую файлы на своем локальном компьютере, и мой редактор обновляет их по sftp при каждом сохранении. При каждом сохранении событие изменения файла запускается дважды.

Я проверил listeners('change') для объекта FSWatcher, который возвращается вызовом fs.watch; но он показывает мой обработчик событий только один раз.

Затем я сделал тест, который должен был сделать первым: «touch file.js» на сервере, и он сработал только один раз. Так что для меня это был не Node; но файл действительно был изменен дважды. Когда файл открывается для записи (вместо добавления), он, вероятно, вызывает изменение, поскольку он очищает содержимое. Затем, когда записывается новый контент, он запускает событие во второй раз.

Это не вызывает у меня никаких проблем; но если вы хотите предотвратить это, вы можете сделать элемент управления нечетным-четным в своей функции обработчика событий, сохранив номера вызовов для каждого файла и делая все, что вы делаете, только при вызовах с четным индексом.

person hasanyasin    schedule 04.07.2012

См. мой ответ на аналогичный вопрос, в котором объясняется, что проблема вызвана тем, что ваш редактор вносит несколько правок в файл при сохранении. .

person Ryan Atallah    schedule 26.04.2014