我用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'} 主要提示 {} {教育程度:“单身汉”
有什么办法可以解决这个问题?我使用的方法与预期方法有所不同吗?预先谢谢你。