【问题标题】:Firebase + DialogFlow - Realtime database- Cloud function return query result only after second requestFirebase + DialogFlow - 实时数据库 - 云函数仅在第二次请求后返回查询结果
【发布时间】:2019-05-01 13:01:19
【问题描述】:

我正在编写一个简单的 Google Action,它将读取 Firebase 实时数据库,并在响应中返回结果。我的问题是,只有在至少 2 次尝试后,查询结果才会被传回以响应 DialogFlow。 下面的屏幕截图显示了模拟器中的最终结果 First query screenshot 响应的第一行是从云函数返回的,其中包含通过“上下文”传递的值。此响应中没有第二行。

下面是第二次发送完全相同的请求后显示结果的屏幕。 Second query screenshot 第一行和之前一样,但这次我也得到了包含查询结果数据的第二行。

看起来我的代码正在“工作”(我从数据库中获取了正确的数据),但由于某种原因,它只有在我快速连续触发至少 2 次时才有效。

以下是处理此请求的代码:

  function googleAssistantHandler(agent) {
   let conv = agent.conv();  
   let outCommandContext = agent.getContext('outcommand');
   let outCharacterContext = agent.getContext('outcharacter');
   let character = outCharacterContext.parameters.character;
   let command = outCommandContext.parameters.command;
   agent.add('<prosody rate="140%" pitch="0.4">' + character +' '+ command +'</prosody>');  
   var movesRef = admin.database().ref('characters/'+character.toLowerCase()+'/moves/'); 

   movesRef.limitToFirst(1).orderByChild("notation")
   .equalTo(command.toString()).on("child_added",function(snapshot){      
   agent.add(`record number is ` + snapshot.key);  
 }); 

}

我尝试过使用 once() 而不是 on() (因为在我的情况下更有意义...我不需要监听数据库的更改,我只想检索一次数据) - 但是,我无法让它工作。

你们能帮我理解为什么我的查询只在第二次触发后才返回结果吗? 谢谢!

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions dialogflow-es actions-on-google


    【解决方案1】:

    在使用数据库时,您需要始终使用 Promise。此外,您看到的第一个响应可能是由于超时的失败函数。如果您在 firebase 中看到控制台日志,您可能会看到错误。还要检查您的默认响应,如果它有 User said $name 或类似的文字,那么这就是导致第一次尝试出现问题的原因。 如果您仍然无法正常工作,请尝试记录返回的数据并在此处发布您的日志。

    【讨论】:

      【解决方案2】:

      您正在使用回调方法从数据库中获取数据,因此无法保证在您的函数返回之前会调用它。要解决这个问题,您需要使用 Promise 并在函数中返回该 Promise,这样函数的最后几行将如下所示

      return movesRef.limitToFirst(1).orderByChild("notation")
                   .equalTo(command.toString()).on("child_added").then(snapshot= > {      
                            agent.add(`record number is ` + snapshot.key);          
                             });
      

      【讨论】:

      • 我想我的问题已经解决了,感谢您的回答。但是,我必须使用 once() 而不是 on() - 而且我认为问题是,我从未使用过“return” - 我之前确实尝试过使用 once(),就像你提到的那样,但这并没有工作。
      猜你喜欢
      • 2019-02-25
      • 1970-01-01
      • 2019-08-20
      • 2023-01-30
      • 1970-01-01
      • 2020-12-01
      • 2021-10-13
      • 2020-03-25
      • 1970-01-01
      相关资源
      最近更新 更多