JavaScript版Bot Framework欢迎场景如何启动menuDialog多级多选对话框
核心问题定位
你的代码有两个直接导致报错的问题:
dialogAndWelcomeBot的成员加入事件里,step变量未定义就直接调用step.beginDialog,语法层面就会报错- 对话框依赖关系完全倒置:你当前传给机器人的根对话框是
FinalAnswerDialog,但你需要优先启动的MenuDialog才应该是根对话框,且MenuDialog本身已经内置了FinalAnswerDialog作为子对话框
修复步骤
1. 调整index.js的初始化顺序
将MenuDialog设为根对话框,把预先初始化好的FinalAnswerDialog作为参数传入MenuDialog:
// 先初始化LUIS和FinalAnswerDialog const finalAnswerDialog = new FinalAnswerDialog(luisRecognizer); // 把FinalAnswerDialog传给MenuDialog构造函数 const rootDialog = new MenuDialog(finalAnswerDialog); // 将MenuDialog作为根对话框传入机器人 const bot = new DialogAndWelcomeBot(conversationState, userState, rootDialog);
2. 重写dialogAndWelcomeBot的欢迎事件逻辑
删除无效的step调用,直接运行根对话框(也就是MenuDialog)即可:
const { CardFactory } = require('botbuilder'); const { DialogBot } = require('./dialogBot'); const { ActivityHandler, MessageFactory } = require('botbuilder'); const { ActionTypes } = require('botframework-schema'); const { MenuDialog } = require('../dialogs/menuDialog'); class DialogAndWelcomeBot extends DialogBot { constructor(conversationState, userState, dialog) { super(conversationState, userState, dialog); this.onMembersAdded(async (context, next) => { const membersAdded = context.activity.membersAdded; const dialogState = conversationState.createProperty('DialogState'); for (let cnt = 0; cnt < membersAdded.length; cnt++) { if (membersAdded[cnt].id !== context.activity.recipient.id) { // 直接运行根对话框,会自动触发MenuDialog的初始瀑布流 await dialog.run(context, dialogState); } } await next(); }); } } module.exports.DialogAndWelcomeBot = DialogAndWelcomeBot;
3. 补全MenuDialog的依赖定义(如果遗漏的话)
确保menuDialog文件开头已经引入所需组件、定义了用到的常量:
const { ComponentDialog, WaterfallDialog, TextPrompt, ChoicePrompt, ConfirmPrompt } = require('botbuilder-dialogs'); // 补全常量定义 const TEXT_PROMPT = 'TEXT_PROMPT'; const NAME_PROMPT = 'NAME_PROMPT'; const CHOICE_PROMPT = 'CHOICE_PROMPT'; const CONFIRM_PROMPT = 'CONFIRM_PROMPT'; const WATERFALL_DIALOG = 'MENU_WATERFALL_DIALOG'; class MenuDialog extends ComponentDialog { // 原有逻辑保持不变即可 }
修改完成后,新用户进入对话时就会直接触发MenuDialog的多级多选菜单,后续在MenuDialog的任意瀑布流步骤中,都可以通过await stepContext.beginDialog('finalAnswerDialog')调用LUIS能力处理用户请求。
内容的提问来源于stack exchange,提问作者Adrián
相关产品推荐
相关产品推荐

