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;j fillVideo(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));
});
});