ChoicePrompt清除UserState或StepContext

时间:2019-02-11 17:26:38

标签: javascript node.js botframework prompt

我用Microsoft BotFramework实现了一个机器人。为了收集用户数据,我使用ChoicePrompts。当用户未选择建议的选项之一时,ChoicePrompt会重复进行,直到用户输入有效的选项为止(这是提示方法的默认行为)。

不幸的是,如果ChoicePrompt再次提示用户,stepContext似乎会刷新。我使用此documentation来存储用户数据。这意味着我会丢失直到那时为止用户提示的数据。

这是我的对话框:

// Create dialog for prompting user for profile data
    this.dialogSet.add(new WaterfallDialog('createProfile', [
        this.promptForName.bind(this),
        this.promptForAge.bind(this),
        this.promptForGender.bind(this),
        this.promptForEducation.bind(this),
        this.promptForMajor.bind(this),
        this.promptForOtherMajor.bind(this),
        this.completeProfile.bind(this)
    ]));

这些是出现问题的方法。在“ promptForEducation”中,使用ChoicePrompt。

        async promptForEducation (step) {
            console.log("Education Prompt");
            // Retrieve user object from UserState storage
            const user = await this.userData.get(step.context, {});
            // Before saving entry, check if it already exists
            if(!user.gender){
                user.gender = step.result.value;
                // Give user object back to UserState storage
                await this.userData.set(step.context, user);
            }
            // Before prompting, check if value already exists
            if (!user.education){
                const user = await this.userData.get(step.context, {});
                console.log(user);
                // Prompt for highest education with list of education options
                return await step.prompt('choicePrompt', 'What is your highest education', ['Bachelor', 'Master']);
            } else {
                return await step.next();
            }
        }
        async promptForMajor (step) {
            console.log("Major Prompt");
            // Retrieve user object from UserState storage
            const user = await this.userData.get(step.context, {});
            console.log(user);
            // Before saving entry, check if it already exists
            if(!user.education){
                user.education = step.result.value;
                // Give user object back to UserState storage
                await this.userData.set(step.context, user);
                console.log(user);
            }
            // Before prompting, check if value already exists
            if (!user.major){
                // Copy List of majors and add "Other" entry
                let majorsOther = majors.slice(0,majors.length);
                majorsOther.push("Einen anderen Studiengang");
                return await step.prompt('choicePrompt', userData.major.prompt, majorsOther);
            } else {
                return await step.next();
            }
        }

如您所见,我按以下方式检索用户数据:

// Retrieve user object from UserState storage
        const user = await this.userData.get(step.context, {});

我这样保存它:

// Give user object back to UserState storage
            await this.userData.set(step.context, user);

直接从“教育”数组中选择有效选项时,一切都很好。这就是我的控制台输出的样子(我在“片段”中记录了3次“用户”对象。在ChoicePrompt之前记录一次,之后两次)

  

用户已添加   名称提示   年龄提示   性别提示   教育提示   {名称:'John Doe',年龄:18,性别:'Männlich'}   主要提示   {名称:'John Doe',年龄:18,性别:'Männlich'}   {名称:'John Doe',     年龄:18岁     性别:“Männlich”,     教育:“单身汉”}

当我用无效消息回答ChoicePrompt时,系统会再次提示我,但随后“ StepContext”似乎刷新并且我的“ user”对象为空:

  

用户已添加   名称提示   年龄提示   性别提示   教育提示   {名称:'John Doe 2',年龄:18,性别:'Männlich'}   主要提示   {}   {教育程度:“单身汉”

有什么办法可以解决这个问题?我使用的方法与预期方法有所不同吗?预先谢谢你。

0 个答案:

没有答案