代码之家  ›  专栏  ›  技术社区  ›  Andrei Petrut

如果输入无效,如何重新提示?

  •  0
  • Andrei Petrut  · 技术社区  · 7 年前

    我在Node.js中使用Google助手,在这里我向用户询问签入日期和签出日期。 如果签出日期晚于签入日期,则我想添加一个重新提示,以便用户可以告诉有效日期。有没有办法从代码中强制重新提示?

    代码段如下:

        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.
            }
    });
    

    我不想结束谈话,而是想重新提示最后一个问题。

    这是签出日期失败后的第一次尝试。 enter image description here

    这是第二次尝试:

    enter image description here

    enter image description here

    enter image description here

    enter image description here

    3 回复  |  直到 7 年前
        1
  •  1
  •   Abhinav Tyagi    7 年前

    要在检查日期后添加重新提示,您需要通过启用“ Enable webhook call for slot filling 在“添加意图”的底部。

    这样,对于所需的每个参数,都将调用webhook NodeJS代码,您可以检查这些参数的有效性。

    重要的一点是重新提示。如果要重新提示输入正确的参数,则需要以编程方式设置上下文。问题是在收集时隙时,Dialogflow为各个参数生成动态上下文。 您需要标识与日期参数关联的上下文,如果重新提示,请使用lifespan 2设置该上下文,以便再次收集该参数。

    一个更好的方法是对所有要验证的参数都有一个单独的意图。这样,您就不必识别动态上下文,您可以在重新提示时使用自己的上下文。
    更新 -使用第二种方法

    • 确定需要验证的插槽。
    • 从当前意图中移除它们。
    • 为每个需要验证的槽创建单独的意图。
    • 为这些意图启用webhook(而不是为插槽,因为您只收集一个)。
    • 在webhook中,如果验证失败,则将输出上下文设置为与输入相同,以便触发相同的意图。
    • 立即回复。
        2
  •  0
  •   Prisoner    7 年前

    你想用 conv.ask() 而不是 conv.close() . 使用 ask() 将以同样的方式发送消息 但会期望用户做出回应 . 顾名思义, close() 关闭麦克风并结束对话。

        3
  •  0
  •   Kyle Begovich    7 年前

    另外,为了简单起见,考虑使用 contexts ,因为它们完成了某种状态的持久性。

    在您的示例中,该操作可以正确地失败(应该如此),但也可以保存签入日期,以便下一个调用可以在两个日期下正确运行。“2018年3月7日”请求也可以触发相同的操作,但读取已保存的签入日期并正常工作。

    推荐文章