我正在将Microsoft Bot Framework与Node.js结合使用。我有一个配置文件,如下所示。
{
"server": {
"port": 3978
},
"dialogs": {
"default": {
"text": "This is some sample text.",
"actions": [
{
"title": "Button 1",
"value": "Action 1"
},
{
"title": "Button 2",
"value": "Action 2"
}
]
},
"hello": {
"text": "hello",
"matches": "^hello$"
},
"asdf": {
"text": "asdf",
"matches": "^asdf$"
},
"goodbye": {
"text": "goodbye",
"matches": "^goodbye$"
}
}
}
我想使用一个for循环来阅读对话框并创建它们,以使它们以
text
值响应并具有matches
值的触发动作。例如,机器人对
hello
的输入响应为hello
,对asdf
的输入响应为asdf
,对goodbye
的输入响应为goodbye
。我为解决此问题而编写的函数如下所示。
var create = function(bot, _config) {
var config = JSON.parse(JSON.stringify(_config));
// Create dialogs from config
var keys = Object.keys(config.dialogs);
for(var i = 0; i < keys.length; i++) {
var dialogName = keys[i];
var dialog = config.dialogs[dialogName];
// Skip over default dialog
if(dialogName == "default") continue;
// Create other dialogs
bot.dialog(dialogName, function(session) {
var text = dialog.text;
session.endDialog(text);
}).triggerAction({
matches: new RegExp(dialog.matches, "i")
});
}
}
当我运行此程序时,机器人会以
goodbye
响应hello
,asdf
和goodbye
的输入。但是,控制台显示应按正确的方式调用正确的对话框。即使当我使用hello
调用session.beginDialog('hello');
对话框时,机器人也会返回goodbye
。似乎是什么引起了这里的问题?
最佳答案
这是javascript中var
的常见“陷阱”。将var
替换为let
应该可以解决您的问题。
与类似的问题
for (var i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
根本原因是
var
是功能范围的,而let
是功能块范围的。有关详细信息,请参见https://www.typescriptlang.org/docs/handbook/variable-declarations.html。关于node.js - 从JSON文件以编程方式创建对话框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50954461/