如何从其他意图中获取数据? (将意图的数据传递给其他意图)

时间:2019-02-14 05:22:20

标签: node.js dialogflow actions-on-google

我正在对Google项目进行操作,该操作将使用基本功能来记住用户所说的内容并将其用于其他目的。

例如,这就是对话的样子:

1     User: Hello
2     Bot: Hey! What's your name?
3     User: Joel
4     Bot: Your name is Joel, is that correct?
5     User: Yes that is correct
6     Bot: Awesome, it's great to meet you Joel.

我知道最初如何获取信息,但是我很难将信息(名称“ Joel”)传递给另一个纯粹用于确认的意图。

这是我所拥有的:

app.intent('greeting', (conv, params) => {
  const context = conv.contexts.set('context');      // working good
  conv.ask(`I got ${params.name}, is that right?`);
});

app.intent('greeting_1', (conv,params) => {
  const context1 = conv.contexts.get('context');  //not working
  conv.ask(`Awesome, it's great to meet yoy ${params.name}`);
 });

如果这有帮助,尤其是我正在读取的错误

TypeError: Cannot read property 'userDecision' of undefined

如何使它正常工作?我有一种感觉,我必须将数据保存在userStorage中,但是我真的只需要这样做,这是非常基本的情况,所以我对此并不熟悉。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

首先,嗨!

您最初将数据存储在UserStorage中的想法可能是正确的,具体取决于您的用例。让我详细说明:

在Google Node.JS客户端库上通过操作保存数据的两种方法

在会话中存储数据

您可以使用conv.data.name = 'Joel'保存对话之间的数据。但是,下次用户再次访问时,这些数据将不可用。

永久存储数据(只要用户允许)

这是userStorage发挥作用的地方。您可以使用conv.user.storage.name = 'Joel'记住用户每次回来的名字。请记住,根据用户的居住地,此类永久性存储可能需要用户的同意。

  

法律注释::在访问userStorage之前获得同意。一些   国家/地区有要求开发商获得同意的法规   在用户可以访问或保存某些信息之前   (例如个人信息)在userStorage中。如果您合而为一   这些国家/地区中,您想访问或保存此类信息   userStorage,您必须使用确认助手来同意   用户并获得同意后,您才能开始存储此类信息   userStorage中的信息。

您还需要在“隐私权政策”中说明要保存的数据。

对于您的特定用例,将不会更改的数据(即名称)存储在userStorage中是一种更好的方法。由于如果仅将其保存为一个对话,则下次需要再次请求权限。

这些应该满足您在平台上保存数据的基本需求。但是,如果确实需要更复杂的状态管理解决方案,则可能需要检查Dialogflow Contexts


编辑:我忽略了您已经在使用上下文。但是答案仍然是正确的,如果您只想在对话中保存数据,则无需使用上下文。

但是我认为您遇到问题的原因是您没有正确设置或获取上下文参数。看一下示例herehere

context.set()方法获得三个参数;名称,寿命和参数。您只是在代码中传递上下文的名称。

而且,仅使用contexts.get()方法不足以读取上下文的参数。您需要像这样阅读它们:

app.intent('Tell Greeting', conv => {
  const context1 = conv.contexts.get('context1')
  const { color, num } = context1.parameters
})

但是,我重复我原来的观点。如果您不需要的话,就不要让自己变得如此复杂。尝试使用conv.dataconv.user.storage