Firebase + DialogFlow-实时数据库-云功能仅在第二次请求后才返回查询结果

时间:2018-11-29 12:49:17

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

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

下面的

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

看起来我的代码正在“运行”(我从数据库中获取了正确的数据),但是由于某些原因,它只有在我连续至少两次触发两次后才起作用。

下面是处理该请求的代码:

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

}

我尝试使用一次()代替on()(因为在我的情况下这更有意义...我不需要侦听数据库中的更改,我只想检索一次数据) -但是,我无法正常工作。

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

2 个答案:

答案 0 :(得分:1)

您正在使用回调方法从数据库中获取数据,因此不保证在返回函数之前将调用该数据。要解决此问题,您需要使用Promise并在函数中返回该Promise,以便函数的最后几行看起来像这样

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

答案 1 :(得分:0)

在处理数据库时,您需要始终使用Promise。此外,您看到的第一个响应可能是由于功能超时而引起的。如果您看到控制台登录到Firebase,则可能会看到错误。另外,请检查您的默认响应,如果它的文本中包含User said $name或类似内容,则这是第一次尝试导致问题的原因。 如果仍然无法正常工作,请尝试记录返回的数据并将日志发布到此处。