在Microsoft Bot Framework v4 for NodeJS中处理HeroCards响应

时间:2019-09-04 19:43:02

标签: node.js facebook async-await botframework

我正在使用Microsoft Bot Framework v4的NodeJs API。而且我的对话框没有硬编码在ActivityHandler中,我只是从那里调用。我正在使用瀑布对话框。因此,当我尝试在Messenger(在Microsoft Bot框架上为Carousel card)上显示HeroCard时,它会成功显示,但是当我单击卡片上的任何按钮时,下一个对话框都没有响应。

我试图处理onMessage钩子,但是,它只是试图验证响应并抛出错误。

....

 ListItems extends ComponentDialog {
    constructor(userProfileState, conversionStateAccessor) {
        super(LIST_ITEMS);
        this.userState = userProfileState;
        this.conversionState = conversionStateAccessor;
        this.addDialog(new WaterfallDialog(LIST_ITEMS_DIALOG, [
            this.sendItems.bind(this),
            this.handleItems.bind(this)
        ]
        ));
        this.initialDialogId = LIST_ITEMS_DIALOG;
    }


    async sendItems(step) {
        .......
        await step.context.sendActivity({ attachments: cards }); // this line is working
    }

    async handleItems(step) {
     console.log(step.result) // the response is not in 'step.result.value' if i click a button on cards

}

感谢您的帮助

---- 我添加了更多详细信息 -----

我正在使用此模板来创建卡片

const card = CardFactory.heroCard('title', 'subtitle', ['imagelink'], [
    { type: ActionTypes.PostBack,
        title: 'product 1',
        value: 'product_1'
    },
    { type: ActionTypes.PostBack,
        title: 'product 1',
        value: 'product_1' 
    },
]);
  await context.sendActivity({ attachments: [card] }); 

可以成功创建汽车,但是问题是,在那之后,如果用户需要,我会发送提示让用户打开主菜单。

所以我这样寄给他们

 await context.sendActivity({ attachments: [card] }); 
 await step.prompt(LIST_ITEMS_MENU_PROMPT, menuPromptPayload);

如果用户单击卡片上的按钮,则会引发错误,因为我认为框架等待提示的答案。无法捕获卡按钮的有效载荷/

1 个答案:

答案 0 :(得分:0)

您需要指示漫游器在sendActivity中的sendItems之后等待并返回响应。同样,如果您不告诉机器人继续运行,那么您将在handleItems中遇到错误,因为除了控制台日志记录之外没有其他事情发生。

async sendItems(step) {
.......
    await step.context.sendActivity({ attachments: cards });

    // Tells the bot to wait. Normally, on `sendActivity`, it continues on to the next step.
    // "DialogTurnStatus" can be found in the `botbuilder-dialogs` package.
    return { status: DialogTurnStatus.waiting }; 
}

async handleItems(step) {
    console.log(step.result);
    return step.next();  // Tells the bot to continue to the next step.
}

希望有帮助!