Javascript TypeError:无法读取属性';家长';未定义的

Javascript TypeError:无法读取属性';家长';未定义的,javascript,html,node-request,Javascript,Html,Node Request,url=“www.w3schools.com/html/html5\u video.asp” 视频链接=[]; 视频列表=[]; 函数fillVideo(回调){ 请求(url、函数(err、res、body){ 如果(正文){ $=cheerio.load(车身); } 链接=$('source'); $(链接)。每个(功能(i,链接){ var值=$(link.attr('src'); 如果(值片(-3)=“mp4”|| value.slice(-4)=“webm”|| 值。切片(-3)=“

url=“www.w3schools.com/html/html5\u video.asp”
视频链接=[];
视频列表=[];
函数fillVideo(回调){
请求(url、函数(err、res、body){
如果(正文){
$=cheerio.load(车身);
}
链接=$('source');
$(链接)。每个(功能(i,链接){
var值=$(link.attr('src');
如果(值片(-3)=“mp4”||
value.slice(-4)=“webm”||
值。切片(-3)=“ogv”){
视频链接推送(值);
视频列表.push($(link.text());
}
})
回调();
});
}
函数writeVideo(){
对于(j=0;jfillVideo(writeVideo)错误:

  • 由于未指定的协议,url无效。我刚刚测试了您的代码,
    request
    抛出以下错误:
  • 错误:无效URI“www.w3schools.com/html/html5\u video.asp”

  • 元素中提取的链接是相对的。这将帮助您理解并解决问题
  • 元素本身没有文本。您必须使用url中的一个,使用
    url.parse(src).pathname
  • 错误处理和一些与变量相关的错误:未声明的变量、未初始化的变量和gloabal变量,这些变量会破坏全局范围并可能导致其他问题
  • 修复:

    您应该为url指定协议(
    http
    https
    ,…)

    另外,您的代码需要一点清理(声明变量,删除全局变量,…):

    然后像这样使用它:

    fillVideo("http://www.w3schools.com/html/html5_video.asp", function(err, videos) {
        if(err) {
            console.log("Error: ", err);
            return;
        }
    
        videos.forEach(function(video) {
            request(video.url).pipe(fs.createWriteStream(video.text));
        });
    });
    
    注意:


    始终检查/记录回调的
    err
    对象。它们准确地告诉您的代码有什么问题。在本例中,URI是无效的,这实际上是正确的。

    我没有做任何更改。。。。我唯一改变的是。。。(这里有一个令人心碎的快速矛盾…)第一个还是第二个在工作?还有:
    if(body){$=cheerio.load(body);}
    似乎是错的。如果
    body
    是falsy怎么办?您只需使用
    $
    ,尽管它没有任何意义。它以前是PDF格式的(秒),但现在都不起作用了!只需删除
    if
    复选框即可。如果
    body
    是空的,那么
    $
    将不匹配任何内容。我感谢您的快速响应,但我的代码到底有什么问题?此外,您的代码似乎更复杂,那么我的代码,无意冒犯,我只是似乎更喜欢我的代码……如果您运行我的代码,那么这应该可以工作(最初我使用了这个,它工作了,)www.electronicinfo.ca/printable-pdfs(由于扩展错误,该程序无法使用,但应正确编译)www.pubcom.com/PDF-test_1.html(该链接第一次有效,但不是第二次)@ibrahim mahrir我意识到我的URI无效,但它是有效的,我不明白为什么?有没有一个原因,我可以使用一个网址一次,但下一次我使用它,它变得无效
    fillVideo("http://www.w3schools.com/html/html5_video.asp", function(err, videos) {
        if(err) {
            console.log("Error: ", err);
            return;
        }
    
        videos.forEach(function(video) {
            request(video.url).pipe(fs.createWriteStream(video.text));
        });
    });