具有异步数据库读取功能的 DialogFlow Firebase Cloud Function

DialogFlow Firebase Cloud Function with async database read

我正在使用 Firebase Cloud Function 作为我的 DialogFlow Google Assistant Action 的实现,但我需要在管理意图之前从 Firebase 数据库中检索数据。这是一个代码片段:

  var userDataRef = sessionDatabaseRef.child(sessionId);
  userDataRef.once("value").then(function(data) {
    console.log(data.val());
    handleIntentAndProcessResponse();
  }).catch(function(){
    console.log("No data yet for this session");
    handleIntentAndProcessResponse();
  });

名为 handleIntentAndProcessResponse 的函数是意图逻辑 returns 通过设置 conv.ask(new SimpleResponse(blah)) 内容进行响应的地方。当我测试它时它失败了并且 Cloud Function 日志给我这个错误:

Error: No response has been set. Is this being used in an async call that was not returned as a promise to the intent handler?

那么,我该如何处理对 Firebase 数据库的异步调用,以便它等待响应?当我处理意图时,我需要使用它 returns 的数据。

如错误消息所示,您需要 return Promise 本身,以便调度程序知道它需要等待异步操作的每个部分完成。

幸运的是,对 userDataRef.once().then().catch() 的调用将评估为一个 Promise,您只需 return 即可。所以这应该不错

  return userDataRef.once("value").then(function(data) {
    console.log(data.val());
    handleIntentAndProcessResponse();
  }).catch(function(){
    console.log("No data yet for this session");
    handleIntentAndProcessResponse();
  });