我对Javascript和NodeJs很陌生,我只是想知道如何构建它以便它会在以下结构中生成一条消息:title和caption。所以我要做的是初始化变量,然后编写一个函数来废弃网站上的数据(scrapData
),然后运行该函数然后将信息放入数组中({{1} }),然后循环将生成带有titles, captions, images_long
的消息。我只是对结构和调用函数感到困惑。以下是命令的代码:
title and caption
答案 0 :(得分:2)
您对scrapData的调用必须等待请求(即异步)才能处理数据。您必须将所有代码放入原始请求的回调中,或考虑使用promises(Promises将支持NodeJS 7 +中的漂亮异步/等待)
将您的需求(“请求”)更改为require(“request-promise-native”),并执行以下操作:
function scrapData(website_url) {
return request(website_url)
.then(body => {
let items = [],
$ = cheerio.load(body);
$('.post-box').each((index, element) => {
let title = $(element).find('.title h2 span').first().text(),
caption = $(element).find('.post-box-excerpt p').first().text(),
thumbnail = $(element).find('.thumbnail img').first().attr('src');
items.push({ title, caption, thumbnail })
})
return items;
})
}
scrapData(website_url)
.then(items => {
//produce embed messages
for (let i = 0; i < items.length; i++)
{
const embed = new Discord.RichEmbed()
.setColor('#8E44AD')
.addField(((i + 1) + ". " + items[i].title), items[i].caption, true);
//set images here
message.channel.send({ embed });
}
})
我不喜欢你删除标题,标题和缩略图的方式,因为索引可能没有被删除。假设您缺少第二个索引的一个标题,那么您将拥有['title 1','title 2','title 3']的标题和标题:['caption 1','caption 3']。确保你刮掉父块的标题和标题。不确定你是如何使用cheerio但我试图在这个例子中尽力而为。
注意,重要的是,$('').each(function() { $(this) })
与$('').each(() => { $(this) })
不同,因为它位于不同的范围内。 Google范围和箭头功能。您可以将我的箭头函数更改为普通函数,或者使用$('').each( (index, element) => { $(element) })
答案 1 :(得分:0)