В настоящее время я пытаюсь разработать 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);
}
}
}
}