使用Microsoft Bot Framework开发聊天机器人:Choice-Prompt不等待用户输入问题
解决Bot Framework中Choice Prompt不等待用户选择的问题
嘿,我之前在Bot Framework v3里也碰到过Choice Prompt不等待用户输入的坑,大概率是对话流程配置或者依赖版本的问题,咱们一步步来排查解决:
1. 先检查瀑布对话的完整配置
你给出的代码看起来不完整,很可能是没把Choice Prompt放在完整的瀑布步骤里。如果只发送了Prompt但没有后续步骤接收结果,对话会直接结束,自然不会等用户选择。
给你补全一个能正常运行的示例:
var restify = require('restify'); var builder = require('botbuilder'); var botbuilder_azure = require("botbuilder-azure"); // Setup Restify Server var server = restify.createServer(); server.listen(process.env.port || process.env.PORT || 3978, function () { console.log('%s listening to %s', server.name, server.url); }); // 创建聊天连接器 var connector = new builder.ChatConnector({ appId: process.env.MicrosoftAppId, appPassword: process.env.MicrosoftAppPassword }); // 监听用户消息 server.post('/api/messages', connector.listen()); // 创建机器人实例 var bot = new builder.UniversalBot(connector); // 核心:完整的瀑布对话流程 bot.dialog('/', [ // 第一步:发送Choice Prompt function (session) { builder.Prompts.choice( session, '请选择一个选项:', ['选项A', '选项B', '选项C'], { listStyle: builder.ListStyle.button } // 可选,用按钮展示选项 ); }, // 第二步:接收用户选择并处理 function (session, results) { if (results.response) { session.send(`你选了:${results.response.entity}`); } else { session.send('你没有选择任何选项哦'); } } ]);
重点是必须有第二个瀑布步骤来接收results,这样机器人才会等待用户的输入。
2. 检查依赖版本兼容性
你用的是Bot Framework v3的包,要确保botbuilder和botbuilder-azure的版本匹配,版本不兼容很容易导致各种奇怪的问题。
可以先查看当前版本:
npm list botbuilder botbuilder-azure
如果版本不一致,安装一套兼容的稳定版本:
npm install botbuilder@3.15.0 botbuilder-azure@3.0.0 --save
3. 排查中间件或连接器问题
如果你加了自定义中间件,要确保中间件没有提前调用next()或者终止对话流程。比如有些日志中间件如果写得有问题,会跳过后续的对话步骤。
另外,本地测试时可以暂时注释掉非必要的中间件,看看是否恢复正常,逐步排查。
4. 用Bot Framework Emulator辅助排查
测试的时候一定要用Bot Framework Emulator,它能显示详细的日志和报错信息。如果Prompt发送失败或者对话流程异常,Emulator里的日志会明确告诉你哪里出了问题,比如权限错误、配置缺失之类的。
如果按照上面的步骤还是解决不了,把完整的代码和Emulator里的错误日志贴出来,这样能更快定位问题~
内容的提问来源于stack exchange,提问作者Lyndra




