等待Microsoft Bot Framework中的事件

时间:2018-02-26 18:35:21

标签: node.js botframework

我有两个对话框。 / test由用户触发(luis) 然后它应该移动到第二个/帮助,当它获得事件时,应该返回/测试并继续那里。 问题是它不会等待事件被触发返回/测试,即使在/ help中的结束对话框只应在事件之后触发。

我的用例是我想让用户登录,如果他想要一些需要auth-token但尚未登录的东西,然后让他继续使用facebook webview登录后的初始请求。 所以用户应该留在"登录"直到事件到达他已成功登录然后继续/ getUserdata。

任何人都知道如何解决这个问题? bot.on错误的approch在这里?

bot.dialog('/getUserData', function (session, args, next) {
        session.beginDialog("/Login");
        [...make request for user data]
        session.send("This is your user data ${userdata}").endDialog();
    }).triggerAction({ matches: "getUserData" });

bot.dialog('/Login', function (session, args, next) {
    session.send("You need to login for this action");
    [..open facebook webview so user can login]
    bot.on("event", function (event) {
        session.send("2:Successfully logged in").endDialog();
    })
})

3 个答案:

答案 0 :(得分:2)

  

我的用例是我想让用户登录,如果他想要一些需要auth-token但尚未登录的东西,然后让他继续使用facebook webview登录后的初始请求。< / p>

根据您的描述,backchannel mechanism不适用于此方案,因为无论何时用户想要登录都无法触发。

我们可以使用beginDialogAction将您的登录对话框附加到原始对话框,有关详细信息,请参阅Handle contextual action。结束登录对话框后,它会将控制权返回到原始对话框。例如:

bot.beginDialogAction('login', '/login', {matches: /^login/i});
bot.dialog('/login', (session)=>{
    //login
    console.log("handling login...");
    session.endDialog();
});

使用这种方法,用户可以在登录时随时开始登录操作,它会将控制权交还给最后一个对话框。

或者,如果您想强制用户在对话框中登录,您可以使用瀑布式步骤,并使用beginDialog一步触发登录对话框,例如:

bot.dialog('/login', (session)=>{
    //login
    console.log("handling login...");
    session.endDialog();
});

bot.dialog('checkshoppingcart', [
    (session)=>{
        session.beginDialog('/login');  
    },
    (session, results)=>{
        //second step
    }
]).triggerAction({matches:/^show shopping cart/i});

答案 1 :(得分:0)

我必须承认,我并不完全理解为什么你将这些作为单独的对话框而不是使用瀑布模式嵌入/帮助嵌套内部/测试。但是我可以看到你误解了应该如何使用bot.on。

这解释了更多 https://docs.botframework.com/en-us/node/builder/chat-reference/classes/_botbuilder_d_.universalbot.html#on

其目的是为&#39; event&#39;注册处理程序,因此您需要在顶层声明它,如下所示,以便在对话框中运行它。

bot.dialog('/test', function (session, args, next) {
    session.beginDialog("/help");
    session.send("3: should be last message").endDialog();
}).triggerAction({ matches: "testDialog" });

bot.dialog('/help', function (session, args, next) {
session.send("1");
}).triggerAction({ matches: "testRoute" });

 bot.on("event", function (event) {
    session.send("2:Event triggered").endDialog();
})

但是,它只处理机器人事件类型,我不确定它是否能够处理您的登录事件。

答案 2 :(得分:0)

作为上述答案的补充,这是我最终工作的代码:

bot.dialog('/getUserData', [
(session, args, next) => {
    session.beginDialog("/Login1");
},
(session, args, next) => {
    session.send(`This is your token ${session.userData.token}, so getUserData could be handled now`).endDialog();
},
]).triggerAction({ matches: "getUserData" });

bot.dialog('/Login1', (session, args, next) => {
    session.send("You need to login for this action");
    // [..open facebook webview so user can login] and wait for event
    bot.on("event", function (event) {
        session.userData.token = "exampletoken";
        session.send("2:Successfully logged in");
        session.endDialog();
    })
})