我正在开发一个应用程序,该应用程序可以抓取网站并将数据公开为休息 api。我正在使用 Node、Express、request、cheerio。我似乎在数组中得到了正确的值..但是在返回之前..数组仍然是空的(在请求函数范围之外)
我无法锻炼我所缺少的东西......你能看看我的代码并告诉我吗?
在 app.js 我指定了路线,
app.use('/timetable', timetable.timetable(url));
在 timetable.js 中
var classes = require('../lib/classes');
var schedule = require('../lib/schedule');
exports.timetable = function(timeTableURL) {
return function(req, res) {
request( timeTableURL, function srapeWebsite(error, response, html ) {
var webHtml = '';
var moreInfo = [];
if( !error && response.statusCode === 200 ) {
webHtml = cheerio.load(html);
}
// schedule.getInfo returns an array of json objects where
// json = {
// day,
// number,
// url
// }
var info = schedule.getInfo(webHtml);
for (var index = 0; index < info.length; index++) {
var json = info[index];
classes.getMoreInfo(json, function (moreInfoJson) {
//console.log shows correct information here
moreInfo.push(moreInfoJson);
};
}
// however moreInfo is empty here..hence not getting anything
res.json(moreInfo);
} );
};
};
思路是,对于数组中的每一个json对象,从指定的url中获取更多信息。
所以最终的结果是,
finalJson = {
day : ''
json : []
}
在 classes.js 中
exports.getMoreInfo = function (info, callback) {
var infoDay = info.day;
var infoNumber = parseInt(info.number);
var moreInfoURL = info.moreInfoUrl;
var stuff = [];
var moreInfo = {};
moreInfo.day = infoDay;
moreInfo.json = [];
if (infoNumber > 0 ) {
request(moreInfoURL, function(error, response,html) {
var moreInfoHtml = '';
if( !error && response.statusCode === 200 ) {
moreInfoHtml = cheerio.load(html) ;
}
var $ = moreInfoHtml;
$('table tbody tr').each ( function getWhatisNeeded () {
var json = getJson ( $(this) );
stuff.push(json);
});
moreInfo.json = stuff;
return callback(moreInfo);
});
}
}