我在遇到DialogFlow意图方面遇到了麻烦。这是我主要意图的唯一跟进工作,而我遇到的问题是
incidents.data
数组为空,在else情况下不会触发conv.ask
语句,并导致DialogFlow抛出空语音响应错误。代码看起来像这样:
app.intent('metro_timetable - yes', async (conv: any) => {
const incidents = await serviceIncidents.getIncidents();
if (incidents.data.length > 0) {
conv.ask('I have incidents')
} else {
conv.ask(
`I wasn't able to understand your request, could you please say that again?`
);
}
});
incidents.data
被存储在全局范围内,并被设置在内部
metro_timetable
的意图。它存储事件以进行跟踪。因为所有yes
响应都会触发跟进,所以我设置了else案例,以便当yes
不理解他们的原始请求并要求他们重复该请求时,如果有人说metro_timetable
,它将捕获该案例。如果incidents.data
实际上有信息可以正确共享对话框触发器,并且I have incidents
被正确读取给用户。
在DialogFlow中,它看起来像这样。我在哪里错了?
答案 0 :(得分:1)
您的描述有些复杂,实际上incidents.data
是如何设置的,但是听起来有可能不是将其设置为空数组,而是根本没有设置它。在这种情况下,我怀疑发生了以下情况:
incidents.data
将不确定incidents.data.length
会导致错误您可能可以通过进行测试(例如)来解决此问题
incidents && incidents.data && incidents.data.length > 0
但是,您的另一个问题似乎是您为实际上不希望将其作为后续情况的场景设置了“跟踪意图”。这是您可能不应该使用后续意图的原因之一,而是仅在发送响应时设置一个上下文,该上下文有意义,然后在您定义的上下文中查找“是”响应。然后,当metro_timetable
无法理解请求时,您无需设置上下文并给出错误。
为此,您将从两个Intent中删除自动生成的metro_timetable-followup
上下文。您将创建自己的上下文,在本示例中,我将其命名为timetable
。
在实现metro_timetable
意图的过程中,如果您回答需要确认的内容(即,当用户说“是”时),则可以使用一些内容来设置timetable
上下文喜欢
conv.contexts.set('timetable',2);
conv.ask('Are you sure?');
然后,您可以创建一个Intent,用于检查timetable
作为传入上下文,并具有与“ yes”等效的训练短语。在这种意图下,您将做您需要做的事情并做出回应。