node.js - Cheerio.load 与 Google Assistant 的响应混淆

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

我有这样的意图,即调用了 Cheerio.load() ,它与响应相混淆。 Google Assistant 不断告诉我没有设置任何响应,尽管稍后在代码中我有响应。控制台还告诉我,异步调用没有返回到处理程序,我认为是 Cheerio.load()。无论如何,我可以解决这个问题,以便它继续在代码底部寻找正确的 conv.ask 吗?它仍然继续运行到那里,因为 console.log(map) 显示了。感谢您的帮助!

app.intent("late drop", (conv,{term,year}) => {
var date = new Date();
var month;
if(term == null){
    month = date.getMonth();

    if(month >= 9 && month <=12){
        term = "fall";
        //console.log("fall")
    }
    else if (month >= 1 && month <= 5) {
        term = "spring";
        //console.log("spring")
    }
    else {
        term = "summer";
        //console.log("summer")
    }
}
if(year == null){
    yearDig = date.getFullYear();
    year = yearDig;
    //console.log(year)
}
var strYear = year.toString();
var semester = term+strYear.substr(2);
const options = {
    uri: `https://www.registrar.psu.edu/academic_calendar/${semester}.cfm`,
    transform: function (body) {
        return cheerio.load(body);
  }
};
rp(options)
.then(($) => {
    let map = {};
    let columnOne = [];
    let columnThree = [];

    $('table').find('tr td:nth-child(1)').each(function (index, element) {
        columnOne.push($(element).text());
      });

    $('table').find('tr td:nth-child(3)').each(function (index, element) {
        columnThree.push($(element).text());
    });

    columnOne.forEach((item, i) => {
        map[item] = columnThree[i];
    });

    console.log(map);
    date = map["2Late Drop Begins"];
    conv.ask("The late drop period begins on " + map["2Late Drop Begins"])
})
.catch((error) => {
    console.log(error);
    conv.ask("An error occured, please try again.");
})

});

最佳答案

问题不在于cheerio。

您似乎正在使用 request-promiserequest-promise-native 进行 HTTP 调用。这会执行一个异步操作,该操作将返回一个 Promise(正如您使用 .then().catch() 所证明的那样。

由于执行异步操作的 Intent 处理程序必须返回一个 Promise,因此您可以简单地返回 rp/then/catch 链返回的 Promise。像改变这一行这样的事情应该有效:

return rp(options)

关于node.js - Cheerio.load 与 Google Assistant 的响应混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577830/

相关文章:

javascript - 获取原始参数输入 - Dialogflow Fulfillment

node.js - html-pdf npm 库在 windows 和 ubuntu 上提供不同的输出

node.js - <ahrerf =""> 用于使用express和Node.JS下载文件

node.js - ioredis pub/sub 没有监听,尽管它已连接

javascript - 如何获得对 Promise 的延迟对象的引用?

node.js - 如何在 Firebase 上通过 Dialogflow 读取数据

node.js - 使用 express、node.js 构建的 restful api 的单元测试日志记录(使用 mocha、supertest 和 chai)

Javascript Promise 链接未按预期工作

javascript - while(true) 循环中的 promise /等待 promise 解决

node.js - Dialogflow v1 webhook - 异步调用后语音未立即返回