ChoicePrompt очищает UserState или StepContext - PullRequest
0 голосов
/ 11 февраля 2019

Я реализовал бота с помощью Microsoft BotFramework.Для сбора пользовательских данных я использую ChoicePrompts.Когда пользователь не выбирает один из предложенных параметров, ChoicePrompt повторяется до тех пор, пока пользователь не введет допустимый параметр (это поведение по умолчанию из метода подсказки).

К сожалению, stepContext, кажется, обновляется, если ChoicePrompt перекомпоновывает пользователя.Я использовал эту документацию для хранения пользовательских данных.Это означает, что я теряю данные, которые были получены от пользователя до тех пор.

Это мой диалог:

// 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)

Пользователь добавил имя Подсказка Возраст Подсказка Пол Подсказка Образование Подсказка{имя: «Джон Доу», возраст: 18 лет, пол: «Männlich»} Основная подсказка {имя: «Джон Доу», возраст: 18 лет, пол: «Мяннлих»} {имя: «Джон Доу», возраст: 18 лет,пол: 'Männlich', образование: 'бакалавр'}

Как только я отвечаю на ChoicePrompt с недопустимым сообщением, я получаю повторный запрос, но затем "StepContext", кажется, обновляется, и мой "пользователь"Объект пуст:

Пользователь добавил имя Подсказка Возраст Подсказка Пол Подсказка Образование Подсказка {имя: 'Джон Доу 2', возраст: 18, пол: 'Männlich'} Основная подсказка {} {образование: 'Бакалавр '}

Есть ли способ это исправить?Я использую какой-то метод, отличный от того, как он предназначен?Заранее спасибо.

...