【发布时间】:2020-06-11 01:24:42
【问题描述】:
我知道问题出在异步等待中。基本上在下面的代码中,第 80 行在第 76 行之前运行,因此返回空值。我该如何纠正这个问题?
我基本上是在使用cheerio 构建一个刮板,当从刮板加载数据需要时间时,就会出现问题。
https://github.com/galdiatorocks/scraper/blob/master/server.js
const request = require('request');
const cheerio = require('cheerio');
const mongoose = require("mongoose");
mongoose.connect(process.env.DB, {
useNewUrlParser: true,
useFindAndModify: false,
useCreateIndex: true,
useUnifiedTopology: true
});
mongoose.Promise = global.Promise;
let db = mongoose.connection;
db.on("error", console.error.bind(console, "MongoDB connection error:"));
scrapeItems();
function scrapeItems(){
const LeaderModel = require("./leader_model");
LeaderModel.find({}, (err,doc) => {
if(err) {console.error(err)};
doc.forEach(async (data) => {
data.booksReco = await readPage(data.storyLink, (error, dat) => {
if(err) console.error(error);
console.log(dat);
});
//console.log(data.booksReco);
})
})
}
function readPage(URL){
request(URL, async function(err, response, body){
if (err) console.error(err);
//console.log(err, response, body);
let $ = cheerio.load(body);
let booksReco = [];
await $('#page tr').each(async (roll, data) => {
let bookdetail = {};
const bookImgPath = await $(data) .find('.kniga')
.children('a')
.children('img')
.attr('src');
if(bookImgPath){
bookdetail.bookImgPath = bookImgPath;
const detail = $(data).find('.opisanie')
bookdetail.bookName = detail.children('a').text().split(/\sby\s/);
bookdetail.bookAuthor = bookdetail.bookName[1];
bookdetail.bookName = bookdetail.bookName[0];
bookdetail.amazonLink = detail.children('a').attr('href');
bookdetail.leaderComment = detail.children('.quote2').text();
if(!bookdetail.leaderComment){
bookdetail.leaderCommentImg = detail.children('.quote2').children('img').attr('src');
bookdetail.whereRecommended = detail.children('.pho').text();
} else {
bookdetail.whereRecommended = detail.children('.recom').text();
}
bookdetail.bookDesc = detail.children('.description').text();
console.log(bookdetail.bookName, bookdetail.bookAuthor);
booksReco.push(bookdetail);
console.log(booksReco);
}
});
console.log(booksReco);
return(booksReco);
})
}
【问题讨论】:
标签: node.js asynchronous async-await cheerio