Node.js SDK中如何合并Dialog与Intent以消除冗余代码?
当然有办法解决这个冗余问题!我在开发Bot Framework Node.js项目时也碰到过一模一样的情况,重复写两行注册代码确实挺烦的,下面分享几个实用的解决方案:
方案1:封装通用注册函数
最直接的方式是把注册Dialog和关联Intent的逻辑打包成一个工具函数,一次性完成两个操作:
// 可以在项目里新建一个工具文件,比如 utils/bot-helpers.js function registerDialogAndIntent(bot, intents, dialogId, dialogPath) { const dialog = require(dialogPath); // 注册Dialog bot.dialog(dialogId, dialog); // 关联对应的Intent intents.matches(dialogId, dialog); } // 调用的时候只需要一行代码 registerDialogAndIntent(bot, intents, 'whats-your-name', './dialogs/whats-your-name');
这样后续新增任何Dialog,都只需要调用这个函数,不用再重复写两行重复的注册逻辑,代码清爽很多。
方案2:批量注册(适合多Dialog场景)
如果你的Dialog文件命名和Intent ID是一一对应的(比如文件名就是Intent的ID),还可以用批量注册的方式,进一步减少重复劳动:
// 定义所有需要注册的Dialog ID列表 const dialogList = [ 'whats-your-name', 'ask-for-location', 'favorite-hobby' ]; // 遍历列表批量注册 dialogList.forEach(dialogId => { const dialog = require(`./dialogs/${dialogId}`); bot.dialog(dialogId, dialog); intents.matches(dialogId, dialog); });
以后新增Dialog,只需要把对应的ID加到dialogList数组里就行,连函数调用都省了,特别适合Dialog数量较多的项目。
小提示
如果你的某些Dialog需要特殊的Intent匹配规则(比如用intents.regexp而不是matches),可以给工具函数加个可选参数,自定义Intent的匹配逻辑,比如:
function registerDialogAndIntent(bot, intents, dialogId, dialogPath, intentMatcher = (intents, id, dialog) => intents.matches(id, dialog)) { const dialog = require(dialogPath); bot.dialog(dialogId, dialog); intentMatcher(intents, dialogId, dialog); } // 特殊场景调用示例 registerDialogAndIntent(bot, intents, 'greet', './dialogs/greet', (intents, id, dialog) => { intents.regexp(/hi|hello|hey/, dialog); });
这样灵活性就更高了,能覆盖大部分场景。
内容的提问来源于stack exchange,提问作者Odirlei Borgert
相关产品推荐
相关产品推荐

