Dialogflow 代理未将数据存储在 agent.conv().data 中

Dialogflow agent isn't storing data in agent.conv().data

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

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

它向控制台打印 getNum is NaN。

我以为数据会持续存在,但我显然错了。

谢谢

您似乎在 Google Cloud Platform 或 Dialogflow 内联编辑器中使用 Cloud Functions。

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

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

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

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

3) 为您的函数添加持久层。在 GCP 中,您可以使用更适合您的场景的 Firestore or the database