【问题标题】:Restart then() block when catch is returned an error当 catch 返回错误时重新启动 then() 块
【发布时间】:2020-06-12 17:29:17
【问题描述】:

当 catch 函数返回错误时,我想重新启动我的代码。

let ig = require('instagram-scraping')


module.exports.instagram = async (req, res) => {
ig.scrapeTag('postthisonmypersonalblogtoo').then(async result => {
    let myPostCodes = [];

    result.medias.forEach(content => {
        if(content.owner_id == '10601516006'){
            myPostCodes.push(content.shortcode);
        }
    })

    await res.render('instagram', {
        myPosts : myPostCodes
    });
}).catch((err) => {
    console.error(err);
    // if(err){ 
          //ig.scrapeTag('postthisonmypersonalblogtoo').then(async result => { ... } //do same things as above
     }
})

}

我想这样做的原因:有时 ig.scrapeTag 方法会找到我的帖子,但有时找不到任何东西并返回给我;

Error: Error scraping tag page "postthisonmypersonalblogtoo"
    at Request._callback (C:\Users\Byte\Desktop\BLOG\node_modules\instagram-scraping\index.js:114:24)
    at Request.self.callback (C:\Users\Byte\Desktop\BLOG\node_modules\request\request.js:185:22)

所以当我遇到这个错误时,我想重新设置 ig.scrapeTag 以再次研究我在 instagram 上的帖子

(顺便说一句,对不起我的英语不好,如果你们对另一个 instagram api 有建议,请告诉我(api 可以是官方的或非官方的都无所谓)

【问题讨论】:

  • 再次递归调用module.exports.instagram 函数(但有递归深度限制)
  • 我在 InstagramRoute.js 中给出这样的响应 -> router.get('/', InstagramController.instagram);当 InstagramController.instagram 返回错误时,我怎么知道?

标签: javascript node.js api instagram


【解决方案1】:

我会将抓取功能移到单独的函数中,并引入重试计数器来跟踪重试次数。也不确定为什么将then/catchasync/await 混合搭配。我认为在任何地方都使用async/await 更具可读性和一致性。像这样:

let ig = require('instagram-scraping')

const MAX_RETRY_COUNT = 2;

async function scrapeInstagram() {  
  let retryCount = 0;
  const scrapeTag = async () => {
    try {
      const result = await ig.scrapeTag('postthisonmypersonalblogtoo');
      return result;
    }
    catch(e) {
       if (retryCount < MAX_RETRY_COUNT) {
          retryCount++;
          scrapeTag();
       } else {
          throw e;
       }
    }
  }

  const result = await scrapeTag();
  let myPostCodes = [];

  result.medias.forEach(content => {
        if(content.owner_id == '10601516006'){
            myPostCodes.push(content.shortcode);
        }
    });
   return myPostCodes;
}

module.exports.instagram = async (req, res) => {
  try {
    const myPostCodes = await scrapeInstagram();
    await res.render('instagram', {
        myPosts : myPostCodes
    }); 
  }
  catch(e) {
    console.log(e);
    res.status(500).send("Could not load from Instagram")
  }
}

【讨论】:

  • 请注意,如果instagram 方法出现错误,除了记录错误之外,您还应该执行res.status(500).send("Could not load from Instagram") 之类的操作。
  • 这段代码实际上很好,但有时它返回我无法读取未定义的属性“媒体”这是因为 ig.scrapeTag 无法从标签中获取任何内容......我觉得我从此变傻了……
  • @Mad 我想你应该对 scrapeTag 的结果进行一些检查,我不知道可以从中返回什么
  • 代码真的很有意义,但为什么不起作用?我将 MAX_RETRY_COUNT 设置为 50,但它仍然返回错误 -> 未定义的“媒体”。
  • 它返回这个错误是因为它无法从我的标签中获取帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 2016-01-21
相关资源
最近更新 更多