我正在将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响应helloasdfgoodbye的输入。但是,控制台显示应按正确的方式调用正确的对话框。即使当我使用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/

10-11 19:50