Bot Framework [Node.js]:bot.customAction处理QnA对象匹配异常问题
解决bot.customAction匹配带问号QnA的问题
看起来你在使用bot.customAction处理QnA匹配时踩了两个小坑,我来帮你梳理下问题所在,再给你一个靠谱的解决方案。
首先拆解你的两种方案问题:
- 第一种方案(仅识别不带问号的内容):应该是你用了精确字符串匹配,比如直接把
matches设成"Fine and you"这种纯字符串。这种情况下,Bot会严格对比用户输入和字符串是否完全一致,带问号的输入自然就匹配不上了。 - 第二种方案(无响应直接走瀑布流):大概率是你的匹配规则写错了(比如正则没转义问号),或者
customAction的定义顺序不对——如果它被放在瀑布流对话之后,Bot会优先触发瀑布流,根本不会走到这个自定义动作。
正确的实现方式:用正则表达式匹配
要实现匹配带问号的多种句式,你需要用正则表达式来定义matches,这样可以灵活覆盖所有目标句式。直接上代码:
// 注意:一定要定义在瀑布流对话之前!! bot.customAction({ // 正则匹配三种开头+带问号的句子,忽略大小写 matches: /^(Fine|Well|Good) and you\?$/i, onSelectAction: (session, args, next) => { session.send("I'm wonderful as always, but thanks for asking!"); } });
正则规则解释:
^和$:确保匹配整个用户输入,避免只匹配部分内容(Fine|Well|Good):匹配三个可选的开头词and you\?:这里的\?是转义后的问号(因为问号在正则里是特殊字符,默认表示“匹配前面字符0次或1次”,必须转义才能匹配实际的问号)i:忽略大小写,比如用户输入fine and you?也能匹配成功
额外优化建议:
如果想让匹配更宽松(比如用户输入前后有空格、单词间多打了空格),可以调整正则为:
matches: /^\s*(Fine|Well|Good)\s+and\s+you\?\s*$/i
\s*:允许输入前后有任意空格\s+:允许单词之间有一个或多个空格
最后记得把customAction定义在你的瀑布流对话之前,这样Bot会优先检查这个自定义匹配规则,匹配成功就直接回复,不会触发瀑布流了。
内容的提问来源于stack exchange,提问作者Joseph Mattey
相关产品推荐
相关产品推荐

