Ответный вызов 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Команда была ликвидирована, и проблема решена.

Другие вопросы по тегам