Javascript 函数的作用是:返回未定义的值

Javascript 函数的作用是:返回未定义的值,javascript,google-chrome-extension,web-scraping,cors,web-crawler,Javascript,Google Chrome Extension,Web Scraping,Cors,Web Crawler,因此,我目前正在制作一个Google Chrome扩展,每当我所有班级的新成绩发布到我大学的成绩册时,它都会通知我,所以目前我正在尝试迭代爬网和刮取URL,并将其与上一次迭代进行比较(…?对此的建议将不胜感激!),以及当前我使用请求()时函数,即使使用异步,函数当前也返回响应和主体的未定义,如果我尝试将所有这些都记录到console.log中,则会为错误提供另一个奇怪的原因 下面是我在那之后得到的错误: bundle.js:24 Uncaught TypeError: Cannot read p

因此,我目前正在制作一个Google Chrome扩展,每当我所有班级的新成绩发布到我大学的成绩册时,它都会通知我,所以目前我正在尝试迭代爬网和刮取URL,并将其与上一次迭代进行比较(…?对此的建议将不胜感激!),以及当前我使用请求()时函数,即使使用异步,函数当前也返回响应和主体的未定义,如果我尝试将所有这些都记录到console.log中,则会为错误提供另一个奇怪的原因

下面是我在那之后得到的错误:

bundle.js:24 Uncaught TypeError: Cannot read property 'headers' of undefined
    at Request._callback (bundle.js:24)
    at self.callback (bundle.js:54273)
    at Request.EventEmitter.emit (bundle.js:95413)
    at Request.start (bundle.js:54842)
    at Request.end (bundle.js:55610)
    at end (bundle.js:54652)
    at bundle.js:54666
    at Item.run (bundle.js:103974)
    at drainQueue (bundle.js:103944)
这是我的代码(更改了URL,所以你看不到我学校的登录URL):

需要注意的一点是,我在请求中添加了“no cors”模式,这样我就可以在每次测试cors时不再出现问题,但这可能是导致此问题的原因吗

谢谢

编辑:我正在使用Browserify在浏览器中使用require()内容。我无法发布bundle.js中的实际代码,因为它非常长,不适合放在这里。我只是想澄清一下。谢谢

EDIT2:以下是我尝试执行console.log(错误)时得到的信息:


正如James所说,如果您得到一个错误,请通过将其记录到控制台或任何您最喜欢的显示调试信息的方法来检查错误

如果您正在获取undefined的
无法读取属性'headers',正如您所说,
response
是未定义的,那么您的第一个回调行将失败,因为它尝试访问
response.headers

这里简单调试的方法是在到达问题行之前(因为问题停在那里),先添加
console.log()
error,因此您只需添加
console.log(error)
作为回调的第一行

前进之路:

尽管您可以修复在
控制台.log(error)
中看到的问题,但此代码注定失败,因为您没有检查是否收到错误并假设请求已成功完成。网络连接混乱,请求可能会由于许多原因而失败,因此在访问
request.headers
之前,您必须检查是否发生任何错误并将其记录下来(或者将其显示给您的客户端,在X秒后重试请求,无论您最喜欢什么)

提示:如果您有一个带有错误参数的回调,请检查它。第一个参数是否存在是有原因的

代码如下所示:

request("https://www.fakeURL.com/", {
    jar: true,
    mode: 'no-cors'
}, function(error, response, body) {
    if (error) {
        console.log(error);
        makeTheRequestAgainIn(5000); // Milliseconds
    } else {
        doWhateverWith(response, body);
    }
});
错误:

只是你不能在浏览器中禁用CORS。您可以在node.js中禁用它,因为它不是浏览器,这就是为什么在请求模块中有一个选项,但是浏览器有安全措施是有原因的。如果它们可以避免,那么它们就毫无意义

简言之:是的,如果您没有在服务器中启用CORS,您将遇到CORS问题

Protip:在浏览器中处理JavaScript时,打开开发人员工具(F12)是一种很好的做法,正如您所做的那样,这样您就可以看到CORS错误自动记录在控制台中(或者发生任何网络错误)。此外,切换到网络选项卡并检查请求头、响应等也是一种好的做法

编辑:刚刚注意到了Chrome扩展插件(dang)。扩展的限制较小,因此可以进行这些调用,正如您在此处看到的:


另外,检查了
请求
npm模块,没有
无cors
值。我认为您将请求与
模块混为一谈。

尝试找出
错误
的内容,然后检查
响应。状态
。您的http请求中似乎存在“某些错误”。我试着检查错误,但问题是它给我的是:错误:opts.mode的值无效(原始帖子中的完整跟踪)。我无法检查response.status,因为response未定义。@OmarBaradei那么,答案最终对您有帮助吗?我尝试执行console.log(错误),它给了我以下信息:error:opts.mode的值无效(我将在上面的原始帖子中发布完整内容,因为注释中的格式很奇怪)。另外,根据你所说的CORS问题,这是否意味着如果我试图从学校的成绩册网站上爬行/刮取,我将无法继续这个项目?难道没有什么可以做的来完成我想做的事情吗?再次感谢。@OmarBaradei是的,这意味着您不能在浏览器上禁用CORS。顺便说一下,我刚刚注意到了“镀铬”的东西。以为你在做一个网站什么的。扩展不像普通浏览那样受限制,您可以在此处查看,因此您可以做您想要做的事情,只要是一个扩展:只需删除mode参数,在清单中设置权限并执行调用,但不要忘记在错误处理中遵循我的指导原则。错误检查是开发时要做的主要事情,您跳过了它。@OmarBaradei还检查了
请求
npm模块,它没有
模式
参数的任何
无cors
值。我猜你把网上的信息混在一起了。如果您使用
请求
模块(与请求API不同),则必须检查该模块上的正确选项,如下所示:。如果您检查源代码中的正确行,您会发现没有“no cors”选项:哇,非常感谢您的帮助!所以,我能够取得重大进展,但经过一些研究,我意识到我所在大学的登录系统是在CAS之后建立的。对于如何通过POST请求使用CAS进行身份验证,我感到非常困惑。对于如何处理这个问题,您有什么建议吗?或者是一个代码片段示例,或者是一些我可以了解的东西?我现在在这一部分非常困惑,好像我试图在我的post请求中使用/serviceValidate url,它会返回一个无效的请求,并显示service和tick
Error: Invalid value for opts.mode
    at new module.exports (bundle.js:108605)
    at Object.http.request (bundle.js:108428)
    at Object.https.request (bundle.js:97056)
    at Request.start (bundle.js:54843)
    at Request.end (bundle.js:55613)
    at end (bundle.js:54655)
    at bundle.js:54669
    at Item.run (bundle.js:103977)
    at drainQueue (bundle.js:103947)
request("https://www.fakeURL.com/", {
    jar: true,
    mode: 'no-cors'
}, function(error, response, body) {
    if (error) {
        console.log(error);
        makeTheRequestAgainIn(5000); // Milliseconds
    } else {
        doWhateverWith(response, body);
    }
});