Botframework SDK v.4 - быстрый шаг в диалоговом окне с водопадом приводит к тому, что объект в хранилище больше не может быть вызван - PullRequest
0 голосов
/ 27 января 2019

В настоящее время я пытаюсь разработать Chatbot, используя SDK v4 платформы Bot, и у меня возникла следующая проблема: На основе шаблона BasicBot от Microsoft я попытался создать свой собственный диалог с водопадом.В пределах функции promptUserForAttachmentStep waterfalldialog пользователю нужно предложить загрузить изображение с AttachmentPrompt.Из-за этого запроса больше невозможно получить доступ к объекту UserProfile в течение следующих шагов из памяти, используя средство доступа к состоянию.Все, что я получил, это пустой объект.

Неважно, что это за подсказка.На шаге подсказки объект все еще может быть вызван.Но не после этого.Однако, как только я удалю приглашение, его можно будет вызвать на следующем шаге.

К сожалению, я не совсем понимаю, почему это так.Это не проблема в шаблоне.

Я был бы рад о помощи

Много приветствий

import { StatePropertyAccessor } from 'botbuilder';
import { ComponentDialog, PromptValidatorContext, WaterfallDialog, WaterfallStepContext, AttachmentPrompt, TextPrompt } from 'botbuilder-dialogs';
import { FaceAPI } from './API_Files/faceAPI_conn';
import { SQLConntector } from './API_Files/mysql_conn';
import { UserProfile } from './userProfile';

const FACE_DIALOG = 'faceDialog';
const LOGIN_DIALOG = 'loginDialog'
const ATTACH_PROMPT = 'attachPrompt';
const SECRET_PROMPT = 'secretPrompt;'

export class authentDialog extends ComponentDialog {
    private userProfileAccessor: StatePropertyAccessor<UserProfile>;
    private faceAPI;
    private sqlConnector: SQLConntector;

    constructor (dialogId: string, userStateAccessor: StatePropertyAccessor<UserProfile>) {
        super(dialogId);

        // TODO: Daten auslagern
        this.faceAPI =  new FaceAPI (
            "https://northeurope.api.cognitive.microsoft.com/face/v1.0/",
            ""
        );
        this.sqlConnector = new SQLConntector (
            "",
            "",
            "",
            ""
        );

        this.addDialog(new WaterfallDialog<UserProfile>(FACE_DIALOG, [
            this.initializeUserStateStep.bind(this),
            this.promptUserForAttachmentStep.bind(this),
            this.identificateFaceId.bind(this),
            this.detectPersonId.bind(this)
        ]));

        this.addDialog(new AttachmentPrompt(ATTACH_PROMPT));
        this.addDialog(new TextPrompt(SECRET_PROMPT));

        this.addDialog(new WaterfallDialog<UserProfile> (LOGIN_DIALOG, [
            this.getEmployeeName.bind(this)
        ]));


        this.userProfileAccessor = userStateAccessor;
    }

    private async initializeUserStateStep (step: WaterfallStepContext<UserProfile>) {
        const userProfile = await this.userProfileAccessor.get(step.context);
        if (userProfile === undefined) {
            await this.userProfileAccessor.set(step.context, new UserProfile());
        }
        return await step.next();
    }

    private async promptUserForAttachmentStep (step: WaterfallStepContext<UserProfile>) {
        // This writes the userProfile object
        console.log(await this.userProfileAccessor.get(step.context));
        return await step.prompt(ATTACH_PROMPT,'Bitte lade zur Autorisierung ein Foto deines Gesichts hoch.');
    }

    private async identificateFaceId (step: WaterfallStepContext<UserProfile>) {
        // This is now an empty object
        console.log(await this.userProfileAccessor.get(step.context));
        if (!step.result[0].contentUrl) {
            await step.context.sendActivities([
                {type: 'typing'},
                {type: 'delay', value: 2000},
                {type: 'message', text: 'Ich benötige ein Foto :)' }
            ])
            return await step.replaceDialog(FACE_DIALOG);
        } else {
            const faceID = await this.faceAPI.getDetectedFaceId(step.result[0].contentUrl);
            if (!faceID) {
                await step.context.sendActivities([
                    {type: 'typing'},
                    {type: 'delay', value: 2000},
                    {type: 'message', text: 'Ich konnte kein Gesicht erkennen :(.' },
                    {type: 'typing'},
                    {type: 'delay', value: 2000},
                    {type: 'message', text: 'Bitte versuche es nochmal.' }
                ]);
                return await step.replaceDialog(FACE_DIALOG);
            } else {
                return await step.next(faceID);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...