首页 > 解决方案 > 如何更改 CATCH 块内的页面(Node.js 和 Express)?

问题描述

我在下面有这个小代码,它会转到 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");
  }

标签: javascriptnode.jsexpressasync-awaitpuppeteer

解决方案


将你的捕获添加到 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);
    })

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


推荐阅读