node.js - conv.data 在 DialogFlow 的后续意图中丢失
问题描述
我在我的 Google Cloud 函数中使用 node.js 8 运行时,附加到我的 DialogFlow 应用程序(V2 API)。我可以使用 conv.data 在当前对话中存储临时数据。不幸的是,conv.data 在后续意图之后似乎没有保留数据。
例如,在我的意图中,以下代码:
conv.data.result = "Hello!";
console.log("[DEBUG] conv.data.result = "+conv.data.result);
conv.followup("customEvent1");
产生以下日志:
[DEBUG] conv.data.result = Hello!
这是我的后续意图:
app.intent('CUSTOM_EVENT_INTENT', (conv) => {
console.log("[DEBUG] - CUSTOM_EVENT_INTENT");
console.log("[DEBUG] - conv.data.result = "+conv.data.result);
if(!conv.data.result) {
console.log("[DEBUG] - I give up");
conv.close("Nessuna risposta");
}
else conv.ask(conv.data.result);
});
这会产生以下日志:
[DEBUG] - conv.data.result = undefined
[DEBUG] - I give up
看起来我在后续意图中遗漏了一些非常重要的东西......
谢谢,
罗伯托
解决方案
我认为您在谈论后续事件而不是后续意图。后续 Intent 被设置为在用户执行某些操作后可能触发的 Intent - 这是通过设置上下文来完成的。后续事件在履行期间设置,旨在触发具有此事件集的 Intent。
在大多数情况下,您不需要使用后续事件。
相反 - 只需调用一个执行处理的函数并回复您希望它执行的方式。没有什么说你的 Handler 函数必须自己做所有事情 - 它可以像任何其他函数一样调用一个函数,并且可以使用参数调用它。
因此,拥有像这样的 Intent 处理程序是完全合理的
app.intent('intent.one', (conv) => {
reply( conv, "Hello!" );
});
app.intent('intent.two', (conv) => {
reply( conv, "How are you?" );
});
app.intent('intent.quit', (conv) => {
reply( conv );
});
function reply( conv, msg ){
if( !msg ){
conv.close( "I give up!" );
} else {
cov.ask( msg );
}
}
这仍然不能解释为什么它不起作用。
您使用后续事件的方式“缺少”的是,当它重定向到事件时,使用conv.followup()
不会将您可能已发送回 Dialogflow 的任何内容发送回。正如文档所说:
通过从 webhook 发送后续事件来触发您选择的意图。[...] Dialogflow 不会将任何内容传回 Google Assistant,因此 Google Assistant 的特定信息,尤其是 conv.user.storage,将被忽略。
但是,您可以做的是将参数发送到从事件中检测到的新 Intent。像这样的东西可能会起作用:
const params = {
result: "Hello!"
};
conv.followup("customEvent1", params);
然后在事件 Intent 的处理程序中:
app.intent('CUSTOM_EVENT_INTENT', (conv) => {
console.log("[DEBUG] - CUSTOM_EVENT_INTENT");
console.log("[DEBUG] - conv.parameters.result = "+conv.parameters.result);
if(!conv.parameters.result) {
console.log("[DEBUG] - I give up");
conv.close("Nessuna risposta");
}
else conv.ask(conv.parameters.result);
});
推荐阅读
- c# - Xamarin.Android:自动刷新 ImageView 的显示,而无需再次调用整个活动
- java - Spark Kryo 注册数组类
- php - 从 PHP 数组中提取特定数据
- service-worker - 如何指向 serviceworker.js 中的当前目录
- python - tf.image.decode_jpeg - contents must be scalar, got shape [1]
- android - 使用 alt 信标在 oreo 上正常工作,但在 pie 上崩溃
- node.js - 使用 kafkaJS 库的 NodeJS kafka 生产者不起作用
- perl - 什么是“perl-dynamic”可执行文件
- javascript - 如何使 npx 与我的自定义 npm 包一起使用?
- azure - azure devops 管道脚本给出 bash 错误