【问题标题】:How to change page inside CATCH block (Node.js & Express )?如何更改 CATCH 块内的页面(Node.js 和 Express)?
【发布时间】:2021-09-09 03:18:37
【问题描述】:

我在下面有这个小代码,它会转到 IMDB 网站来抓取电影标题。该代码实际上可以与小的 catch 一起正常工作,以进行基本的错误处理。

app.get("/", function(err, req, res){
  function handleError(err) {
    console.log('Ohhhh nooo');
    console.log(err.message);
  }
  (async ()=>{
    let movieURL= "https://www.ximdb.com/title/tt1375666/?ref_=hm_tpks_tt_i_1_pd_tp1_cp";
    let browser = await puppeteer.launch();
    let page = await browser.newPage();
    await page.goto(movieURL, {waitUntil: "networkidle2"});
    const movieData = await page.evaluate(() => {
      let movieTitle = document.querySelector('div[class="TitleBlock__TitleContainer-sc-1nlhx7j-1 jxsVNt"] > h1').innerText;
      let movieRating = document.querySelector('span[class="AggregateRatingButton__RatingScore-sc-1ll29m0-1 iTLWoV"]').innerText;
      return{movieTitle, movieRating}
    });
    res.render("index2", {movieData});
    console.log(movieData);

    await browser.close();
    return;

  })()
  .catch(handleError);
});

我故意将 IMDB 更改为“ximdb”以防出错。当我启动此脚本时,控制台会记录错误消息。然而,

  1. 浏览器上的加载标志不会停止。发生错误时如何停止脚本/加载?
  2. 我希望在发生错误时更改浏览器上的页面。下面的这段代码是我想要做的,但它不起作用并且给出了错误((node:696) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'render' of undefined)。
  function handleError(err, res) {
    console.log('Ohhhh nooo');
    console.log(err.message);
    res.render("index2");
  }

【问题讨论】:

  • 代码会产生什么错误...? “不起作用”是一个无用的问题描述。
  • 请在您的问题中包含错误。

标签: javascript node.js express async-await puppeteer


【解决方案1】:

将你的捕获添加到 page.evaluate 承诺中,目前它在那里出错并且 res.render 永远不会被调用。

const movieData = await page.evaluate(() => {
      let movieTitle = document.querySelector('div[class="TitleBlock__TitleContainer-sc-1nlhx7j-1 jxsVNt"] > h1').innerText;
      let movieRating = document.querySelector('span[class="AggregateRatingButton__RatingScore-sc-1ll29m0-1 iTLWoV"]').innerText;
      return{movieTitle, movieRating}
    }).catch(err => {
        console.log('error', err);
        res.render(some error page);
    })

如果没有电影数据,您现有页面的渲染可能无法正常工作。

【讨论】:

  • 非常感谢您的回答。我已经按照你说的做了,但问题仍然存在。 catch 块不允许我呈现新页面。显然我的代码在某处被破坏了。我会进行更深入的研究。再次感谢您。
  • 您可以尝试对代码中的每个等待执行相同的操作,并使用不同的错误消息来查找卡住的位置。否则,在每隔一行之间放置一个 console.log 可以帮助您识别代码运行的位置。
  • 我会照你说的做,多放更多的console.log行来查找错误。谢谢你的建议
  • 我发现了问题,当我从`app.get("/", function(err, req, res){`中取出err时它工作正常。我不知道为什么但是这就是解决方案。
猜你喜欢
  • 2017-08-09
  • 2013-05-27
  • 2014-07-29
  • 1970-01-01
  • 2020-10-22
  • 2021-02-27
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多