Ответный вызов hubot вызывается дважды
Фон
Моя команда и я работали над проектом автоматизации с использованием hubot и vmware pyvmomi. Одной из основных функций, которые я пытался исправить, является функция create vm. Как команда, мы решили, что мы хотим, чтобы hubot задавал пользователю ряд вопросов, а затем отправлял пакет в REST API, который мы написали. Ветвь скрипта hubot, над которой я работаю, находится здесь. Конкретная проблема, над которой я работаю, заключается в том, что функция create генерирует больше ответов по мере того, как создается больше vms, а затем отправляет несколько пакетов. Я зарегистрировал информацию о проблеме во вкладке проблемы репо. Смотрите проблему, связанную с отправкой нескольких пакетов.
Просматривая проблемы, записанные в исходном коде hubot, я обнаружил, что другим людям также любопытно, можно ли запрограммировать hubot на диалог (выпуск 950). Поэтому я решил реорганизовать функцию создания, чтобы позволить мне возвращать код диалога, как только я закончу.
Эта проблема
После перезаписи (см. Ветку refactor-create-vm-function) я сталкиваюсь с проблемой дублирования вызовов. Я опубликовал скриншот вывода, когда hubot отвечает на сообщение create vm.
Я думаю, что происходит то, что функция выполняется один раз, когда она передается, и затем снова, когда она фактически отвечает. Не уверен, как предотвратить первый звонок, и могу ли я вообще это предотвратить. Если это невозможно предотвратить, каковы предложения по написанию диалога hubot? Я открыт для предложений как javascript, так и coffeescript, поскольку сценарии hubot могут быть и другими.
Довольно плохо знаком с javascript (и coffeescript в этом отношении), поэтому любая помощь будет принята с благодарностью!
3 ответа
Проблема здесь не в том, что метод вызывается неоднократно, а в том, что он пытается выполнить рекурсию, не имея определения для себя. Добавление ссылки на область других функций, где вы делаете рекурсивный вызов, должно помочь.
(например _this.askQuestion(...)
вместо askQuestion(...)
После небольшого отладочного кода (спасибо @heckj) мы обнаружили, что проблема была вызвана неправильным форматированием регулярного выражения .respond
, Так как он не был правильно отформатирован, он всегда передавал значение true и поэтому сразу выполнял свой обратный вызов. Следовательно, почему функция вызывается до и после ввода.
Я также узнал, что регулярные выражения являются первоклассными гражданами в javascript, поэтому вам не нужно заключать их в одинарные кавычки.
С учетом сказанного, вот регулярное выражение до и после:
До
{'regex': '(memory\s|mem\s)(\d{1,4})(.*)?'}
После
{'regex': /(memory\s|mem\s)(\d{1,4})(.*)?/i}
У меня была аналогичная проблема с Hubot при использовании WebStorm 2023.1.3. В моем случае проблема была вызвана тем, что WebStorm автоматически создал второй файл .js из моего кода CoffeeScript. Это привело к тому, что команда была выполнена дважды, что привело к неожиданному поведению.
Я обнаружил, что решить эту проблему помогает удаление CoffeeScript или сгенерированного файла JavaScript. При наличии в проекте только одного из этих файлов дублирование выполненияrobot.hear
Команда была ликвидирована, и проблема решена.