Dialogflow es Dialogflow代理是';t将数据存储在agent.conv()数据中

Dialogflow es Dialogflow代理是';t将数据存储在agent.conv()数据中,dialogflow-es,dialogflow-es-fulfillment,Dialogflow Es,Dialogflow Es Fulfillment,在dialogflow中,处理程序如下所示: exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); let conv = agent.conv(); console.log('Dialogflow Request headers: ' + J

在dialogflow中,处理程序如下所示:

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  let conv = agent.conv();
  console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
  console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
我已将conv设置为agent.conv()。欢迎用户,我想存储一个随机生成的数字

  function welcome(agent) {
    agent.add(`Welcome to Med Ed! Can I get your name?`);
    //generate random number -> num
    conv.data.random = num
    console.log(conv.data.random)
  } 
以上操作正常,数字打印到控制台上。但当调用另一个函数处理程序时,我尝试提取数字:

 function intentHandler(agent) {
        // get the number from the agent.conv()
        getNum = conv.data.random 
        console.log(getNum)
 } 
控制台的print getNum是NaN

我认为数据仍然存在,但我显然错了


谢谢

您似乎正在谷歌云平台或Dialogflow内联编辑器中使用云功能

在这两种情况下,实现代码都在云函数中运行,而云函数应该是。每个请求都可以在不同的环境中执行;因此,如果需要存储变量,建议添加额外的持久层,例如数据库

对于您的用例,您可以考虑以下三个建议:

1) 。通常,函数将在相同的环境中执行,因此,可以将信息存储在全局变量中;但是,这并不能保证,因此您应该处理信息不可用的情况

2) 。您可以将随机数作为参数存储在上下文中,只要上下文处于活动状态,它就会通过Dialogflow发送到webhook


3) 在函数中添加持久层。在GCP中,您可以使用或使用更适合您的场景的。使用firestore的问题是,点击数据库并返回确实需要时间。关于全局变量,我遇到了一个问题,我认为全局变量在使用前需要初始化,例如,让randNum=0。如果这是从一个局部函数中设置的,比如randNum=6,那么下一次调用randNum时将返回其初始值0。我读了这篇文章,这就是为什么我认为可以使用agent.conv().数据。@jcantona你在“谷歌行动”平台上尝试过agent.conv()方法吗?它应该在那里作为临时仓库使用。尽管如此,我还是会选择上下文,以防您想将其用于其他集成。对于全局变量,理论上,除非函数在不同的环境中执行,否则该值不会更改为初始值;但是,由于该值可能不是“持久化”的,所以我仍然选择contextsThx。是的,我试着在google上的actions中使用agent.conv(),但仍然没有坚持。但上下文对此非常满意。谢谢