NodeJS:无法将新数据推送到阵列上

时间:2017-04-05 02:40:46

标签: arrays node.js request return cheerio

我目前正在使用外部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
      }
   }
  }
 ]
 })
});

1 个答案:

答案 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)
    }
  });
 }
})