Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在azure bot节点v4中创建自适应卡并继续特定响应对话框_Node.js_Azure_Botframework_Azure Bot Service_Adaptive Cards - Fatal编程技术网

Node.js 如何在azure bot节点v4中创建自适应卡并继续特定响应对话框

Node.js 如何在azure bot节点v4中创建自适应卡并继续特定响应对话框,node.js,azure,botframework,azure-bot-service,adaptive-cards,Node.js,Azure,Botframework,Azure Bot Service,Adaptive Cards,我目前正在尝试创建一个以自适应卡开始的瀑布 最初,我让瀑布在每一步都使用ChoicePrompt,但在第1步中,我需要两个选项来打开URL-因此改为一个自适应卡来启动(这是必需的还是有办法从用户提供的ChoicePrompt中的特定响应打开URL?) 这里的问题是,每个响应(不是openUrl按钮)都会导致自适应卡重复自身,而不是将非openUrl选项传递到对话框的下一步 我还存储每个对话框响应(当前在一个数组中,我在对话框结束时清除了该数组),以基于所有组合的响应执行特定操作(是否有比将用户响

我目前正在尝试创建一个以自适应卡开始的瀑布

最初,我让瀑布在每一步都使用ChoicePrompt,但在第1步中,我需要两个选项来打开URL-因此改为一个自适应卡来启动(这是必需的还是有办法从用户提供的ChoicePrompt中的特定响应打开URL?)

这里的问题是,每个响应(不是openUrl按钮)都会导致自适应卡重复自身,而不是将非openUrl选项传递到对话框的下一步

我还存储每个对话框响应(当前在一个数组中,我在对话框结束时清除了该数组),以基于所有组合的响应执行特定操作(是否有比将用户响应推入数组更好的方法保存用户响应?)

总之,对于初始自适应卡,如果返回的不是
one
,我希望它继续重复自身,但是如果返回
one
,我希望它使用该值移动到对话框的下一部分,并保存该值(可能比我上面做的更好)

最后,如果在当前选项卡中有一个简单的方法打开URL,而不是一个新的方法,那就太好了

任何关于如何使用英雄卡的见解都会非常有用


提前感谢。

您是否使用step字典存储您的值?我使用的是如上所述的数组
answers
。如何使用step字典?自适应卡和英雄卡是两种不同的东西。你想用哪一个?(由于此线程中有多个其他人,如果您想让我看到您的答复,您需要@提及我。)@KyleDelaney hero card它似乎是
application/vnd.microsoft.card.hero
@JDT-我对您在这里尝试做什么感到非常困惑。如果你的英雄卡只包含一个向机器人发送消息的按钮,为什么还有这个按钮?为什么不直接显示一张带有两个openUrl按钮的卡片,然后不等待用户输入就立即进入下一步呢?此外,听起来您好像在说您无法继续瀑布的下一步,这可能是因为您没有保存对bot状态的更改。你能不能把你的英雄卡从等式中拿出来,看看你能不能找到一个普通的瀑布来处理简单的文本?
var answers = [];
async firstStep(stepContext) {
    var send = {
        text: 'question',
        attachments: [
            {
              "contentType": "application/vnd.microsoft.card.hero",
              "content": {
                "text": null,
                "buttons": [
                  {
                    "type": "imBack",
                    "title": "one",
                    "value": "one"
                  },
                  {
                    "type": "openUrl",
                    "title": "two",
                    "value": "https://example.com"
                  },
                  {
                    "type": "openUrl",
                    "title": "three",
                    "value": "https://example.com"
                  },                                            
                ]
              }
        }
        ]
    }
    return await stepContext.context.sendActivity(send);
}
async secondStep(stepContext) {
    const resp = stepContext.result.value;
    answers.push(resp);
            
    return await stepContext.prompt('ChoicePrompt', {
        prompt: questions[1],
        choices: ChoiceFactory.toChoices(options[1]),
        style: ListStyle.suggestedAction
    });
}
async thirdStep(stepContext) {
    const resp = stepContext.result.value;
    answers.push(resp);
    return await stepContext.prompt('ChoicePrompt', {
        prompt: questions[2],
        choices: ChoiceFactory.toChoices(options[2]),
        style: ListStyle.suggestedAction
    });
}
async finalStep(stepContext) {
    const resp = stepContext.result.value;
    answers.push(resp);
    
    // get func
    var fun = await this.func(answers);
    //do stuff with what function returns
    
    // reset quiz
    answers = [];
    return await stepContext.endDialog();    
}