Dialogflow:这是在异步调用中使用的吗

Dialogflow: Is this being used in an async call

我是 javascript 世界的新手,一直在修补 Google 上的操作。我有一个以前 运行ning 的操作,但在尝试简化我的代码之后,我 运行ning 遇到了一个我似乎无法弄清楚的新错误。该代码应该调用数据库并根据用户选择的日期 return 向用户提供信息。

问题: 该代码应该根据用户选择的日期调用数据库并向用户提供 return 信息。当我使用 axios 调用 URL 时,意图似乎崩溃了。当我测试我的功能时,我从 Google 云平台收到以下错误:"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?"

app.intent('Moon', (conv, {date}) => {
  // Sets date to today if none given
  if (!date) {
    date = new Date().toISOString();
  }
  // Slices date string to match date format in database
  const dateSlice = date.slice(5, 9);
  // Call to row in dabase for the given date
  function getData() {
    return axios.get(`example.com/search?Date=${dateSlice}`);
  }
  return getData().then(res => {
    res.data.map(con => {
      conv.ask(`On X date there will be a ${con.Object1}`);
    });
  });
});

我不太了解 Promise 和 await 但这似乎是问题所在。我不确定在没有这些对象的情况下如何将我的代码设置为 运行。我试图在我的 return 之前插入一个 Promise 对象,但它使函数的其余部分无法访问。我还检查了 Axios 是否有任何更新,但没有,我使用的是最新版本。该错误是否与 return 之一有关?

可能与 Promises 相关,但您似乎正确地处理了它们。

  • axios.get() 的调用正在返回一个 Promise...
  • ...您将在 getData()...
  • 中返回
  • ... 作为 getData().then() 块的一部分在 'Moon' 意图处理程序中返回。

我更怀疑这是逻辑问题。如果 res.data 是一个空数组,那么将不会调用 conv.ask(),所以你最终什么都不问。

如果 res.data 有两个以上的项目,也会有问题。在这种情况下,您将生成一个错误,因为您回复了两个以上 "simple" 回复。

无论哪种方式 - 您可能希望记录 res and/or res.data 以确保您得到了您的想法。