【问题标题】:Dialogflow: Is this being used in an async callDialogflow:这是在异步调用中使用的吗
【发布时间】:2020-05-10 18:12:25
【问题描述】:

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

问题: 该代码应该调用数据库并根据用户选择的日期向用户返回信息。当我使用 axios 调用 URL 时,意图似乎崩溃了。当我测试我的函数时,我从 Google Cloud Platform 收到以下错误:“错误:未设置响应。这是在未作为对意图处理程序的承诺返回的异步调用中使用的吗?”

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 了解不多,但这似乎是问题所在。我不确定在没有这些对象的情况下如何让我的代码运行。我试图在返回之前插入一个 Promise 对象,但这会使函数的其余部分无法访问。我还检查了 Axios 是否有任何更新,但没有,我使用的是最新版本。错误是否与返回之一有关?

【问题讨论】:

  • 尝试将句子组合成一个句子,然后调用conv.close(sentence); 可能吗?还有一个错字可能:${dataSlice} 应该是${dateSlice};可能是 axios 请求失败了
  • 您指出错字是正确的。如果在示例中修复了它,但这只是我在将代码复制到 Stack Overflow 时犯的一个错误;我的实际代码没有这个问题。

标签: javascript node.js promise dialogflow-es actions-on-google


【解决方案1】:

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

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

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

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

无论哪种方式 - 您可能希望登录 res 和/或 res.data 以确保您得到您的想法。

【讨论】:

  • 你是对的 res.data 返回一个空数组。这实际上是由于我对数组进行切片的方式。 slice 方法中的 end 参数上升到但不包括给定位置。因此,在我的情况下,ISO 字符串被剪切为“05-1”,而不是“05-10”。感谢您的帮助!
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多