在提示系统无法读取用户输入值的同时使用NodeJS进行Botframework

时间:2019-03-25 18:44:15

标签: node.js botframework

Azure Bot框架 SDK4 NodeJS

在对话框状态下,我正在异步函数内使用“ return await step.prompt”。但是,一旦用户输入值,它就不会将用户输入值视为提示输入,而是会进入luisrecognizer进行匹配。

我为不同的对话框编写了类似的代码,在该对话框中效果很好。

恳请您提供一些宝贵的意见。

Azure Bot框架 SDK4 NodeJS

this.addDialog(new WaterfallDialog('OrderStatusDialog', [
   async function(step) {
     return await step.context.sendActivity(reply);
   },
   async function(step) {
     var cardValue = step.context.activity.value;
     if (cardValue) {
        if (cardValue.action == "Order_Number") {
           return await step.prompt('textPrompt', 'enter order number');
        } else if (cardValue.action == "Serial_Number") {
           return await step.prompt('textPrompt', 'enter serial number');
        } else {
        }
     }
     return await step.next();
     // return await step.endDialog();
  },
  async function (step) {
     var cardValue = step.context.activity;
     console.log("****** cardValue");
     console.log(cardValue);
     console.log("****** step After");
     console.log(step);
     return await step.endDialog();
  }
]));

在提示步骤,它应该读取用户输入的值。当我执行步骤..

时,堆栈也为空

2 个答案:

答案 0 :(得分:0)

不幸的是,您的代码有一些问题。但是,希望这可以帮助他们解决问题。运行以下代码没有问题。

一,仔细检查您安装了哪个版本的Botbuilder。至少有一个我不熟悉的调用('this.addDialog'),它似乎不是当前SDK的一部分,并且在测试时对我不起作用。

二,按如下所示配置您的机器人。从技术上讲,您应该能够在问题中通过各个步骤。但是,关于您的某些信息行不通,我不知道该怎么办。但是,下面的设置确实可以工作,并且符合已经接受的惯例。

三,第一步是调用“ step.context.sendActivity(reply)”。在下一步中,您尝试读取该调用的返回值。这是行不通的,因为sendActivity只是从bot向用户发送一条语句(例如,“欢迎使用我的bot!”)。您需要执行提示以捕获用户的输入响应(请参见下文)。

您似乎正在尝试从卡中读取值。由于您没有提供该代码,因此我通过用户的文本提示提供“ Order_Number”和“ Serial_Number”来伪造该值。

您还应该利用漫游器状态选项。与其使用变量'cardValue',不如考虑使用UserState或DialogState来存储对会话很重要的用户值。

最后,在这个简单的示例中,如果您多次通过,则订单号和序列号将相互覆盖。

const START_DIALOG = 'starting_dialog';
const DIALOG_STATE_PROPERTY = 'dialogState';
const USER_PROFILE_PROPERTY = 'user';

const ACTION_PROMPT = 'action_prompt';
const ORDER_PROMPT= 'order_prompt';
const SERIAL_PROMPT= 'serial_prompt';
...

class ExampleBot {
    constructor(conversationState, userState) {
        this.conversationState = conversationState;
        this.userState = userState;

        this.dialogState = this.conversationState.createProperty(DIALOG_STATE_PROPERTY);

        this.userData = this.userState.createProperty(USER_PROFILE_PROPERTY);

        this.dialogs = new DialogSet(this.dialogState);

        this.dialogs
            .add(new TextPrompt(ACTION_PROMPT))
            .add(new TextPrompt(ORDER_PROMPT))
            .add(new TextPrompt(SERIAL_PROMPT));

        this.dialogs.add(new WaterfallDialog(START_DIALOG, [
            this.promptForAction.bind(this),
            this.promptForNumber.bind(this),
            this.consoleLogResult.bind(this)
        ]));
    }

    async promptForAction(step) {
        return await step.prompt(ACTION_PROMPT, `Action?`,
            {
                retryPrompt: 'Try again. Action??'
            }
        );
    }

    async promptForNumber(step) {
        const user = await this.userData.get(step.context, {});
        user.action = step.result;
        if (user) {
            if (user.action == 'Order_Number') {
                return await step.prompt(ORDER_PROMPT, 'enter order number');
            } else if (user.action == 'Serial_Number') {
                return await step.prompt(SERIAL_PROMPT, 'enter serial number');
            } else {
            }
        }
        return await step.next();
    }

    async consoleLogResult(step) {
        const user = await this.userData.get(step.context, {});
        user.orderNumber = step.result;
        console.log('****** cardValue');
        console.log(user);
        console.log('****** step After');
        console.log(step);
        return await step.endDialog();
    }

    async onTurn(turnContext) {

    ... //Other code

    // Save changes to the user state.
    await this.userState.saveChanges(turnContext);

    // End this turn by saving changes to the conversation state.
    await this.conversationState.saveChanges(turnContext);

    }
}

希望有帮助!

答案 1 :(得分:0)

在保存对话状态后,无论如何我都可以替换对话框。

await this.conversationState.saveChanges(context);