【问题标题】:DialogFlow Firebase Cloud Function with async database read具有异步数据库读取的 DialogFlow Firebase 云功能
【发布时间】:2020-03-10 21:33:56
【问题描述】:

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

  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 的函数是意图逻辑通过设置conv.ask(new SimpleResponse(blah)) 内容返回响应的地方。当我测试它失败并且云功能日志给我这个错误:

错误:未设置响应。这是否在未作为对意图处理程序的承诺返回的异步调用中使用?

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

【问题讨论】:

    标签: javascript firebase google-cloud-functions dialogflow-es dialogflow-es-fulfillment


    【解决方案1】:

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

    幸运的是,对 userDataRef.once().then().catch() 的调用将评估为 Promise,您可以直接返回它。所以这应该不错

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

    【讨论】:

    • 非常感谢。这行得通。还有一个问题:我必须在会话之间存储数据,因为在我意识到云函数在调用之间共享实例之前,我使用了一个全局类来执行此操作,并且我的数据正在被其他会话覆盖。我需要担心这个班级的比赛条件吗?我可以在处理意图时使用来自 Firebase 的会话数据来更新它吗?
    • 我认为我认为它不允许同时多次调用函数实例是正确的。
    • 您是正确的,云函数可能会在调用之间共享实例,或者您可能会获得完全独立的实例。确保您解决有关此问题的任何问题的最佳案例是创建一个新的 StackOverflow 问题,其中包含您希望如何保存会话信息(已经有许多问题和答案在讨论这个问题)以及您的担忧在哪里那些其他的问题/答案仍然让你不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2017-11-08
    • 2018-08-20
    • 2020-09-10
    相关资源
    最近更新 更多