无法将控制权传递给botbuilder中Node.js的对话框中的另一个方法

时间:2017-05-25 10:36:31

标签: node.js botframework

我正在使用Node.js和MS Bot Framework创建我的第一个机器人,并且我试图弄清楚如何在对话框中将控制从一个方法传递到另一个方法。

在C#的Bot Framework中,它非常简单:

context.Wait(NextMethodName);

其中NextMethodName是机器人收到下一条用户消息后运行的方法的名称。

我正在尝试在Node.js中做类似的事情。我有两个功能。第一个提示用户输入内容或单击按钮,第二个应处理用户的输入。我正在努力将控制传递给第二个函数。

bot.dialog('subscribe', [
function (session) {
    var card = new builder.HeroCard(session)
        .title("Subscribe for reminders?")
        .text("It seems you're not enrolled yet. Subscribe for reminders to submit your work hours?")
        .buttons([
            builder.CardAction.imBack(session, "subscribe", "Subscribe")
        ]);

    var msg = new builder.Message(session).attachments([card]);

    session.send(msg);
    //next(); //compile error
},
function (session, results) {
    if (results.response === 'subscribe') {
        session.send('You are now subscribed to reminders through ' + session.message.user.channelId + '.');
    }
    else {
        session.send('You must subscribe to reminders before using this bot.');
    }
}
]);

如何在用户点击按钮或回答任何内容后运行第二个功能?

1 个答案:

答案 0 :(得分:1)

在node的botbuilder sdk中,您可以定义包含所谓“步骤”的瀑布对话框。每一步都会导致另一步(如瀑布)。根据文件:

  

'瀑布让您使用一系列步骤收集用户的输入。机器人是   始终处于向用户提供信息或询问的状态   问题,然后等待输入。在Bot的Node版本中   建造者它是推动这种前后流动的瀑布。

某些步骤可以从询问用户信息的提示开始,然后以下步骤通过使用dialogData保存响应来处理响应。然后,您可以调用下一个函数参数将控制权传递给下一步。在您的情况下,调用next()会给您一个错误,因为该函数不在范围内,您必须将其作为步骤函数的参数提供。

点击此处查看此示例:

https://github.com/Microsoft/BotBuilder-Samples/tree/master/Node/core-MultiDialogs

在我的第一步代码中,我会这样做:

function (session,args,next) {
    var card = new builder.HeroCard(session)
        .title("Subscribe for reminders?")
        .text("It seems you're not enrolled yet. Subscribe for reminders to submit your work hours?")
        .buttons([
            builder.CardAction.imBack(session, "subscribe", "Subscribe")
        ]);

    var msg = new builder.Message(session).attachments([card]);

    session.send(msg);
    next();
}

但这只会引导您进入下一步,所以如果您想等待用户输入(带文本提示),或者例如使用HeroCard操作,就像您在样本中定义的那样:

您的卡片通过按钮触发“订阅”参数“订阅”。可以将此视为通过按下卡上的按钮在对话框中调用的功能。现在要定义该功能,我们这样做:

// An action is essentially a card calling a global dialog method
// with respective parameters. This  dialog action will route the action 
// command to a dialog.
bot.beginDialogAction('subscribe', '/subscribe');

// Create the dialog for the action...
bot.dialog('/subscribe', [
    function (session, args) {
       //do something!
    }
]);