从JSON文件以编程方式创建对话框

时间:2018-06-20 18:01:48

标签: node.js azure botframework

我正在将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的输入helloasdf的输入asdfgoodbye的输入作出响应{1}}。

我为解决这个问题而编写的函数看起来像这样。

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") }); } } 响应goodbyehelloasdf的输入。但是,控制台显示应按正确的方式调用正确的对话框。即使当我使用goodbye调用hello对话框时,机器人也会返回session.beginDialog('hello');

什么似乎是导致问题的原因?

1 个答案:

答案 0 :(得分:5)

这是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了解详情。