我目前正在使用外部API构建Web服务并使用Cheerio抓取数据。我能够从Cheerio获取数据并尝试将新变量从爬网推送到项目数据(文章)。我已经尝试过item.push({“new content”:这里的新内容});以及return(变量名),但我无法将新变量追加到字段image_url。我对Cheerio和整体服务的输出没有任何问题。
如何附加内容变量?
request("<API URL HERE>", function(error, response, body) {
var myObject = JSON.parse(body);
var listing = myObject.items;
arr = listing.map(function(item) {
var url = item.url;
//get individual images for articles based on URL
update = request(url, function (error, response, body) {
if (!error) {
var $ = cheerio.load(body)
content = $('.post-body').find('img').attr('src');
return content;
}
else {
console.log("We’ve encountered an error: " + error);
}
});
//return format for each article
return {
"title": item.title,
"subtitle": item.content.substr(0,100),
"image_url": update.content,
"buttons":
[{
"type":"web_url",
"url":item.url,
"title":"View Item"
}]
};
});
res.send({
"messages": [
{
"attachment":{
"type":"template",
"payload":{
"template_type":"generic",
"elements": arr
}
}
}
]
})
});
答案 0 :(得分:0)
在处理外部API数据库等时,代码变为异步。这意味着,当您发送更新请求时,变量内容将是未定义的,因为响应尚未返回。 Node提供了许多处理异步代码的方法。一种很酷的方式是承诺。如果您不了解承诺,请阅读:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise
你应该做的是这样的事情:
var url = item.url;
//get individual images for articles based on URL
const update = () => {
return new Promise((resolve,reject) => {
request(url, function (error, response, body) {
if (!error) {
var $ = cheerio.load(body)
content = $('.post-body').find('img').attr('src');
resolve(content);
}
else {
reject(error)
}
});
}
})