Azure Bot框架 SDK4 NodeJS
在对话框状态下,我正在异步函数内使用“ return await step.prompt”。但是,一旦用户输入值,它就不会将用户输入值视为提示输入,而是会进入luisrecognizer进行匹配。
我为不同的对话框编写了类似的代码,在该对话框中效果很好。
恳请您提供一些宝贵的意见。
Azure Bot框架 SDK4 NodeJS
this.addDialog(new WaterfallDialog('OrderStatusDialog', [
async function(step) {
return await step.context.sendActivity(reply);
},
async function(step) {
var cardValue = step.context.activity.value;
if (cardValue) {
if (cardValue.action == "Order_Number") {
return await step.prompt('textPrompt', 'enter order number');
} else if (cardValue.action == "Serial_Number") {
return await step.prompt('textPrompt', 'enter serial number');
} else {
}
}
return await step.next();
// return await step.endDialog();
},
async function (step) {
var cardValue = step.context.activity;
console.log("****** cardValue");
console.log(cardValue);
console.log("****** step After");
console.log(step);
return await step.endDialog();
}
]));
在提示步骤,它应该读取用户输入的值。当我执行步骤..
时,堆栈也为空答案 0 :(得分:0)
不幸的是,您的代码有一些问题。但是,希望这可以帮助他们解决问题。运行以下代码没有问题。
一,仔细检查您安装了哪个版本的Botbuilder。至少有一个我不熟悉的调用('this.addDialog'),它似乎不是当前SDK的一部分,并且在测试时对我不起作用。
二,按如下所示配置您的机器人。从技术上讲,您应该能够在问题中通过各个步骤。但是,关于您的某些信息行不通,我不知道该怎么办。但是,下面的设置确实可以工作,并且符合已经接受的惯例。
三,第一步是调用“ step.context.sendActivity(reply)”。在下一步中,您尝试读取该调用的返回值。这是行不通的,因为sendActivity只是从bot向用户发送一条语句(例如,“欢迎使用我的bot!”)。您需要执行提示以捕获用户的输入响应(请参见下文)。
您似乎正在尝试从卡中读取值。由于您没有提供该代码,因此我通过用户的文本提示提供“ Order_Number”和“ Serial_Number”来伪造该值。
您还应该利用漫游器状态选项。与其使用变量'cardValue',不如考虑使用UserState或DialogState来存储对会话很重要的用户值。
最后,在这个简单的示例中,如果您多次通过,则订单号和序列号将相互覆盖。
const START_DIALOG = 'starting_dialog';
const DIALOG_STATE_PROPERTY = 'dialogState';
const USER_PROFILE_PROPERTY = 'user';
const ACTION_PROMPT = 'action_prompt';
const ORDER_PROMPT= 'order_prompt';
const SERIAL_PROMPT= 'serial_prompt';
...
class ExampleBot {
constructor(conversationState, userState) {
this.conversationState = conversationState;
this.userState = userState;
this.dialogState = this.conversationState.createProperty(DIALOG_STATE_PROPERTY);
this.userData = this.userState.createProperty(USER_PROFILE_PROPERTY);
this.dialogs = new DialogSet(this.dialogState);
this.dialogs
.add(new TextPrompt(ACTION_PROMPT))
.add(new TextPrompt(ORDER_PROMPT))
.add(new TextPrompt(SERIAL_PROMPT));
this.dialogs.add(new WaterfallDialog(START_DIALOG, [
this.promptForAction.bind(this),
this.promptForNumber.bind(this),
this.consoleLogResult.bind(this)
]));
}
async promptForAction(step) {
return await step.prompt(ACTION_PROMPT, `Action?`,
{
retryPrompt: 'Try again. Action??'
}
);
}
async promptForNumber(step) {
const user = await this.userData.get(step.context, {});
user.action = step.result;
if (user) {
if (user.action == 'Order_Number') {
return await step.prompt(ORDER_PROMPT, 'enter order number');
} else if (user.action == 'Serial_Number') {
return await step.prompt(SERIAL_PROMPT, 'enter serial number');
} else {
}
}
return await step.next();
}
async consoleLogResult(step) {
const user = await this.userData.get(step.context, {});
user.orderNumber = step.result;
console.log('****** cardValue');
console.log(user);
console.log('****** step After');
console.log(step);
return await step.endDialog();
}
async onTurn(turnContext) {
... //Other code
// Save changes to the user state.
await this.userState.saveChanges(turnContext);
// End this turn by saving changes to the conversation state.
await this.conversationState.saveChanges(turnContext);
}
}
希望有帮助!
答案 1 :(得分:0)
在保存对话状态后,无论如何我都可以替换对话框。
await this.conversationState.saveChanges(context);