我正在将Google Assistant与Node.js结合使用,在此我要求用户提供入住日期和退房日期。 如果退房日期晚于入住日期,那么我想添加一个重新提示,以便用户可以说出有效日期。有没有办法从代码中强制重新提示?
代码段如下:
app.intent('myIntent', conv => {
// validation
const checkInDateString = conv.parameters[CHECK_IN_ARGUMENT];
const checkOutDateString = conv.parameters[CHECK_OUT_ARGUMENT];
var checkInDate = new Date(checkInDateString);
var checkOutDate = new Date(checkOutDateString);
console.log("Check-in date is: " + checkInDate.getTime());
console.log("Check-out date is: " + checkOutDate.getTime());
if (checkInDate.getTime() > checkOutDate.getTime())
{
conv.close('Pick a check-out date that is later than the check-in date!');
console.error('The check-in date must be before the check-out date!');
}
else
{
// save to db.
}
});
我不想结束对话,而是想重新提示最后一个问题。
这是第二次尝试:
答案 0 :(得分:1)
要在检查日期后添加重新提示,您需要通过启用“添加意图”底部的“ Enable webhook call for slot filling
”来处理NodeJS代码中的参数/槽。
这样,对于每个所需的参数,都会调用webhook NodeJS代码,您可以检查参数的有效性。
重点是重新提示。要重新提示输入正确的参数时,需要以编程方式设置上下文。问题将是,在收集插槽时,Dialogflow为各个参数生成动态上下文。
您需要标识与日期参数关联的上下文,如果再次提示,请设置其寿命为2,以便再次收集该参数。
更好的方法是对要验证的所有参数有单独的意图。这样,您将不必标识动态上下文,并且可以在重新提示时使用自己的上下文。
更新-使用第二种方法
答案 1 :(得分:0)
您要使用conv.ask()
而不是conv.close()
。使用ask()
将以相同的方式发送消息,但希望用户响应。顾名思义,close()
确实关闭了麦克风并结束了对话。
答案 2 :(得分:0)
为简便起见,这里另外考虑使用contexts,因为它们可以实现状态的持久性。
在您的示例中,该操作可能会正确失败(应该如此),但还会保存签入日期,以便下次呼叫可以同时使用两个日期正确运行。 “ 2018年3月7日”请求也可以触发相同的操作,但读取已保存的入住日期并可以正常运行。