基于GitHub Bot-Builder示例创建的NLP Dispatch Bot:QnA模块报错求助
我之前调试Dispatch Bot时也碰到过类似的报错,这个错误本质是代码里尝试对一个undefined的值调用数组的map方法——说白了就是你处理QnA返回结果的逻辑里,某个预期是数组的字段没拿到值,最常见的就是QnA的answers数组变成了undefined。下面给你几个排查和解决的方向:
先确认QnA Maker的连接和配置是否正确
先排除最基础的配置问题:检查你Bot里的QnA Maker订阅密钥、知识库ID、Endpoint URL这些参数,是不是和Azure门户里QnA Maker服务的信息完全一致?有时候复制时多了空格、少了末尾的路径字符,都会导致请求失败,返回的结果里根本没有answers字段。
你可以直接用Postman调用QnA Maker的API测试下,看看响应里有没有answers数组——哪怕是空数组也没问题,至少不是undefined。检查QnA结果处理的代码逻辑
找到你代码里处理QnA返回结果的那段(一般在Dispatch识别后的分支里,或者专门的QnA处理函数),看看是不是直接就对results.answers调用map了?如果QnA请求失败或者返回结构异常,results.answers就会是undefined。
给你个简单的修复方式,先加个判断再处理:// 处理QnA结果前先做校验 if (results.answers && Array.isArray(results.answers)) { const qnaResponses = results.answers.map(answer => answer.answer); // 后续处理逻辑 } else { // 如果没有有效结果,返回默认回复 await context.sendActivity("抱歉,我暂时无法回答这个问题"); }另外还要检查Dispatch模型的路由是否正常——会不会是Dispatch没有正确把请求路由到QnA模块,导致QnA的结果根本没被正确获取,所以对应字段是
undefined?可以重新训练并发布Dispatch模型,确保它能识别需要路由到QnA的意图。核对Bot Framework依赖版本
有时候示例代码的版本和你本地安装的依赖版本不匹配,比如QnA Maker SDK更新后,返回的响应结构变了,原来的代码就找不到answers字段了。你可以看看项目里package.json的botbuilder、botbuilder-ai版本,是不是和GitHub示例里的版本一致?如果不一致,要么跟着示例的版本安装依赖,要么修改代码适配新的响应结构。加日志定位具体问题
要是上面的方法都没解决,就在onTurnError里加详细日志,输出QnA请求的完整响应,看看到底返回了什么:async onTurnError(context, error) { console.error('[onTurnError] 错误详情:', error); // 尝试输出QnA的识别结果 try { const qnaResults = await this.qnaRecognizer.recognize(context); console.log('QnA返回结果:', JSON.stringify(qnaResults, null, 2)); } catch (qnaError) { console.log('QnA请求失败:', qnaError); } // 其他错误处理逻辑 await context.sendActivity("哎呀,我出错了😅"); }看了日志你就能清楚知道,是QnA请求失败了,还是返回结果里没有
answers字段,再针对性解决就好。
内容的提问来源于stack exchange,提问作者Koushik

