У вас есть несколько проблем здесь, поэтому трудно точно сказать, какая из них является реальной проблемой, но все они сводятся к следующему утверждению в вашем вопросе:
Пожалуйста, не спрашивайте меня, почему я использовал определенный кусок кода
Мы понимаем, что вы новичок - мы все были там! Но копирование кода без понимания того, что он должен делать, - рискованный путь.
Тем не менее, в вашем дизайне и коде есть несколько моментов, которые вызывают у меня проблемы:
Микширование библиотек
Похоже, вы загружаете как библиотеку actions-on-google, так и библиотеку диалогового потока. Хотя большая часть того, что вы делаете, связана с библиотекой actions-on-google, intentMap
- это то, что используется библиотекой d-f.
Вы не можете смешать два. Выберите один и поймите, как регистрировать обработчики и как эти обработчики выбираются.
Регистрация обработчиков с помощью Actions-on-Google
Если вы используете библиотеку a-o-g, вы обычно создаете объект app
с чем-то вроде
const app = dialogflow();
, а затем зарегистрировать каждый обработчик с чем-то вроде
app.intent( 'intent name', conv => {
// handler code here
});
Вы зарегистрируете приложение для обработки запроса и ответа, например
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Зарегистрировать обработчик с диалоговым потоком выполнения
Подход с использованием диалогового потока аналогичен, но он предлагает создать Map
, который сопоставляет Intent Name с функцией-обработчиком. Примерно так:
let intentMap = new Map();
intentMap.set( 'intent name', handlerFunction );
Где handlerFunction
- это также имя функции, которую вы хотите использовать в качестве обработчика. Это может выглядеть примерно так:
function handlerFunction( agent ){
// Handler stuff here
}
Затем вы можете создать агента, установить объекты запроса и ответа, которые он должен использовать, и указать ему использовать карту, чтобы выяснить, какой Intent Handler вызывать с чем-то вроде
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
agent.handleRequest( intentMap );
Содержимое представляет то, что пользователь 1053 * делает, а не то, что вы делаете с ним
Помните, что Intents представляют действие пользователя.
То, что вы делаете на основе этого действия, зависит от многих вещей. В вашем случае, после того, как они выбрали опцию, вы хотите ответить так же, как если бы они вызвали ее с определенным намерением. Правильно?
Вы не делаете это, пытаясь вызвать это намерение.
Что вы делаете, так это то, что оба обработчика вызывают функцию, которая делает то, что вы хотите. В этом нет ничего особенного - оба просто вызывают одну и ту же функцию, как и многие другие коды, которые могут вызывать общие функции.
Не пытайтесь динамически регистрировать обработчики
В связи с предыдущей проблемой, попытка зарегистрировать новый обработчик в существующем обработчике не будет делать то, что вы хотите. К тому времени уже слишком поздно, и обработчики уже вызваны.
Могут быть ситуации, когда это имеет смысл - но их очень мало, далеко друг от друга, и очень очень продвинутая концепция. В общем, зарегистрируйте все ваши обработчики в центральном месте, как я обрисовал выше.