Google Action Webhook 内联编辑器 Returns 在 API 调用之前

Google Action Webhook Inline Editor Returns Before the API call

这是我的第一个 Google 行动计划。调用后我有一个简单的插槽。用户在提示符上输入值,插槽调用 webhook 并使用用户输入调用 API。一切正常。然而,webhook returns 甚至在 API 调用完成处理和 returns 值(第 1 conv.add 行)之前向用户发送。我确实在日志中看到,在 Webhook returns 到用户之后,从 API 开始的所有内容都正常记录。下面是我正在使用的代码。我正在使用内联编辑器。我错过了什么?预先感谢您的帮助。

const { conversation } = require('@assistant/conversation');
const functions = require('firebase-functions');
var https = require('https');
const fetch = require('node-fetch');
const app = conversation({debug: true});

app.handle('SearchData', conv => {
   
  const body = JSON.stringify({
        val: "this is my body"
    });
  
      // prepare the header
    var postheaders = {
        'Content-Type' : 'application/json',
        'Auth' : 'MyAuthCreds'
    };
 
fetch('https://host.domain.com/data', {
        method: 'post',
        body:    body,
        headers: postheaders,
    })
    .then(res => res.json())
    .then(d => {
        console.log(d);
                var profile = d;//JSON.parse(d);
            console.log(d.entries);
                console.log("Length: "+ d.entries.length);
                if(d.entries.length > 0)
                {
                    console.log("Data found");
                    conv.add("Data found"); //line 1
            }
                else
                {
                    console.log("no data found");    
                    conv.add("no data found"); //line 1
            }
    })        
    .catch(function (err) {
            // POST failed...
            console.log(err);
    });
});

exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);

您的问题是您的处理程序正在进行 API 异步调用,但 Assistant Conversation 库不知道您正在这样做。因此,一旦处理程序完成,它就会尝试发回响应,但是您的异步​​响应(then() 块中的内容)尚未执行。

为了解决这个问题,您需要 return 一个 Promise 对象,这样库就知道要等到 Promise 完成后才会 returns。

幸运的是,对于您的情况,这应该非常简单。 fetch 和所有 .then() 块 return 一个 Promise。所以你需要做的就是在调用 fetch 之前添加一个 return 语句。所以像这样:

return fetch('https://host.domain.com/data', {