亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

node下,運行彈出錯誤

http://img1.sycdn.imooc.com//57e1ff070001649708320260.jpg

請問各位大神,這個問題應該怎么解決?

我試過npm init --yes了,還是不行。

下面是代碼

var?http?=?require('http');
var?promise?=?require('bluebird');
var?cheerio?=?require('cheerio');
var?baseUrl?=?'http://www.xianlaiwan.cn/learn/';
var?videoIds?=?[75,134,197,259,348,637];

function?filterChapters(html){
	var?$?=?cheerio.load(html);
	/*var?chapters?=?$('.mod-chapters');
	var?title?=?$('#page_title?.path?span').text();
	var?num?=?parseInt($($('.info_num?i')[0]).text().trim(),10);*/

	var?chapters?=?$('.chapter')

????var?title?=?$('.course-infos?.path?span').text()

????var?number?=?parseInt($($('.meta-value?strong')[3]).text().trim(),?10)

	/*courseData?=?{
		title:?title,
		number:?number,
		videos:?[{
			chapterTitle:?'',
			videos:[
				title:?'',
				id:?''
			]
		}]
	}
*/

	var?courseData?=?{
		videos:?[],
		number:?number,
		title:?[]
	};
	chapters.each(function(item){
		var?chapter?=?$(this);
		var?chapterTitle?=?chapter.find('strong').text();
		var?videos?=?chapter.find('.video').children('li')
		var?chapterData?=?{
			chapterTitle:?chapterTitle,
			videos:[]
		}

		videos.each(function(item){
			var?video?=?$(this).find('.J-media-item');
			var?videoTitle?=?video.text();
			var?id?=?video.attr('href').split('/video/')[1];

			chapterData.videos.push({
				title:?videoTitle,
				id:?id
			})
		})
		courseData.push(chapterData);
	})
	return?courseData;
}

function?printCourseInfo(coursesData)?{
	coursesData.forEach(function(courseData)?{
		console.log(courseData.num?+?'人學過'?+?courseData.title?+?'\n');
	})

	coursesData.forEach(function(courseData)?{
		console.log('###'?+?'courseData.title'?+?'\n');
		var?chapterTitle?=?item.chapterTitle;

		courseData.forEach(function(item)?{
			console.log('###'?+?'courseData.title'?+?'\n');
			var?chapterTitle?=?item.chapterTitle;

			console.log(chapterTitle+'\n');

			item.videos.forEach(function(video)?{
				console.log('?【'+video.id+'】'+video.title+'\n');
			})
		})
	})
}

function?getPageAsync(url)?{
	return?promise(function(resolve,reject)?{
		console.log('正在爬取');

		http.get(url,function(res)?{
			var?html?=?'';

			res.on('data',function(data){
				html?+=?data;
			})

			res.on('end',function(){
				resolve(html);
			})
		}).on('error',function(e){
			reject(e);
			console.log('獲取課程數據出錯');
		})

	})
}

var?fetctCourseArray?=?[];

videoIds.forEach(function(id)?{
	fetctCourseArray.push(getPageAsync(baseUrl?+?id));
})

promise
	.all([])
	.then(function(pages)?{
		var?courseData?=?[];

		pages.forEach(function(html)?{
			var?courses?=?filterChapters(html);

			courseData.push(courses);
		})

		courseData.sort(function(a,b)?{
			return?a.number?>?b.number
		})

		printCourseInfo(courseData);
	})


正在回答

2 回答

首先 promise.all(fetctCourseArray);
其次慕課網改版了,你上面的title跟number都應該獲取不到數據

1 回復 有任何疑惑可以回復我~
#1

蒼白的尾巴 提問者

謝謝你,我把這里改了。 但是還是報錯,和前面的報錯是一樣的。 _bitField 是什么意思?。縫romise.js 里有這個變量。
2016-09-22 回復 有任何疑惑可以回復我~
#2

甩甩是落雨 回復 蒼白的尾巴 提問者

一步步console.log()輸出調試,看是從哪里開始數據有問題;我也是菜鳥,正在學習中。
2016-09-23 回復 有任何疑惑可以回復我~
#3

蒼白的尾巴 提問者 回復 甩甩是落雨

額,一起加油吧
2016-09-23 回復 有任何疑惑可以回復我~
#4

甩甩是落雨 回復 蒼白的尾巴 提問者

courseData.forEach(function(item){第70行 courseData.videos.forEach(function(item){
2016-09-23 回復 有任何疑惑可以回復我~
#5

甩甩是落雨 回復 蒼白的尾巴 提問者

命令行報錯有顯示的,第70行
2016-09-23 回復 有任何疑惑可以回復我~
#6

蒼白的尾巴 提問者 回復 甩甩是落雨

終于找到問題了,是Promise對象的問題。謝謝你
2016-09-24 回復 有任何疑惑可以回復我~
查看3條回復

終于爬出來了。。。

//加載內置模塊http的方法
var?http?=?require('http');
//通過bluebird加載Promise對象
var?Promise?=?require('bluebird');
//加載cheerio?API
var?cheerio?=?require('cheerio');
//為了簡寫,把重復的url部分放在baseUrl里,用的時候遍歷一下就可以了
var?baseUrl?=?'http://www.xianlaiwan.cn/learn/';
var?videoIds?=?[75,134,197,259,348,637];

function?filterChapters(html){
	var?$?=?cheerio.load(html);
????//trim()消除空格
	var?chapters?=?$('.chapter')
????var?title?=?$('.course-infos?.w?.path?span').text();	
????var?number?=?parseInt($($('.static-item?.js-learn-num')).text().trim(),?10)

	/*?預想的數據結構
	courseData?=?{
		title:?title,?課程名稱
		number:?number,?學習人數
		videos:?[{?
			chapterTitle:?'',
			videos:[
				title:?'',
				id:?''
			]
		}]
	}
	*/

	var?courseData?=?{
		title:?title,
		number:?number,
		videos:?[]
	};
	chapters.each(function(item){
		var?chapter?=?$(this);
		var?chapterTitle?=?chapter.find('strong').text();
		var?videos?=?chapter.find('.video').children('li')
		var?chapterData?=?{
			chapterTitle:?chapterTitle,
			videos:?[]
		}

		videos.each(function(item){
			var?video?=?$(this).find('.J-media-item');
			var?videoTitle?=?video.text();
			var?id?=?video.attr('href').split('/video/')[1];

			chapterData.videos.push({
				title:?videoTitle,
				id:?id
			})
		})
		courseData.videos.push(chapterData);
	})
	return?courseData;
}

function?printCourseInfo(coursesData)?{
	coursesData.forEach(function(courseData)?{
		console.log(courseData.number?+?'人學過'?+?courseData.title);
	})

	coursesData.forEach(function(courseData)?{
		console.log('###'?+?courseData.title);
		
		courseData.videos.forEach(function(item)?{
			var?chapterTitle?=?item.chapterTitle;

			console.log(chapterTitle);

			item.videos.forEach(function(video)?{
				console.log('?【'+video.id+'】'+video.title);
			})
		})
	})
	console.log('\n');
}
/*
	異步的爬取數據,傳入需要爬的網站的url
*/
function?getPageAsync(url)?{
	return?new?Promise(function(resolve,reject)?{
		console.log('正在爬取'+url);
		//給http模塊添加get方法
		//get方法必須傳入url,可以添加success方法(成功時運行的函數)
		http.get(url,function(res)?{
			var?html?=?'';
			//on()綁定事件
			//data事件是不斷獲取返回的數據
			res.on('data',function(data){
				//獲取所有頁面代碼
				html?+=?data;
			})
			//end事件是結束發送請求
			res.on('end',function(){
				//undefined
				resolve(html);
			})
		}).on('error',function(e){
			//綁定錯誤事件,返回錯誤原因
			reject(e);
			console.log('獲取課程數據出錯');
		})

	})
}
//Promise對象的數組
var?fetctCourseArray?=?[];
//遍歷所有的課程id(id保存在這個數組videoIds里了)
videoIds.forEach(function(id)?{
	//爬到所有課程頁面的源碼,返回Promise對象,并保存在數組里
	fetctCourseArray.push(getPageAsync(baseUrl?+?id));
})
//Promise.all(),返回一個Promise對象,使傳入的參數(可迭代參數,比如數組)都resolve一遍
//Promise.resolve(),解析promise對象,按照后面的.then方法解析
//.then(),鏈式調用
Promise
	.all(fetctCourseArray)
	.then(function(pages)?{
		//存放頁面解析結果
		var?coursesData?=?[];
		//pages是課程頁面
		pages.forEach(function(html)?{
			//通過filterChapters解析html
			var?courses?=?filterChapters(html);
			//把解析的結果放進coursesData[]
			coursesData.push(courses);
		})
		//由高到低排序
		coursesData.sort(function(a,b)?{
			return?a.number?>?b.number
		})
		//打印輸出
		printCourseInfo(coursesData);
	})


0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
進擊Node.js基礎(二)
  • 參與學習       76735    人
  • 解答問題       242    個

本教程帶你攻破 Nodejs,讓 JavaScript流暢運行在服務器端

進入課程

node下,運行彈出錯誤

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號