等待Microsoft Bot Framework中的事件

问题描述 投票:1回答:3

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

我的用例是我想让用户登录,如果他想要一个需要auth-token但尚未登录的东西,然后让他继续使用facebook webview登录后的初始请求。因此,用户应该保持“登录”状态,直到事件到达他已成功登录,然后继续使用/ getUserdata。

任何人都知道如何解决这个问题?这不是错误的做法吗?

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();
    })
})
node.js botframework
3个回答
2
投票

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

根据您的描述,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});

0
投票

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

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

它的目的是为“事件”注册处理程序,因此您需要在顶层声明它,如下所示,以便在对话框中运行它。

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();
})

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


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();
    })
})
© www.soinside.com 2019 - 2024. All rights reserved.