You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript版Bot Framework欢迎场景如何启动menuDialog多级多选对话框

核心问题定位

你的代码有两个直接导致报错的问题:

  1. dialogAndWelcomeBot的成员加入事件里,step变量未定义就直接调用step.beginDialog,语法层面就会报错
  2. 对话框依赖关系完全倒置:你当前传给机器人的根对话框是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:12:03