Firebase+DialogFlow-实时数据库-Cloud函数只在第二次请求后返回查询结果



我正在编写一个简单的Google Action,它将读取Firebase实时数据库,并在响应中返回结果。我的问题是,只有在至少两次尝试后,查询结果才会返回以响应DialogFlow。下面的屏幕截图显示模拟器中的最终结果首次查询截图响应的第一行是从Cloud函数返回的,并且包含用";上下文";。这个答复没有第二行。

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

看起来我的代码是";工作";(我从数据库中获得了正确的数据(,但出于某种原因,只有当我连续快速触发它至少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(((因为这在我的情况下更有意义……我不需要听数据库上的更改,我只想检索一次数据(,但是,我无法让它工作。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新