【问题标题】:NodeJS Cannot read property 'push' of undefinedNodeJS无法读取未定义的属性“推送”
【发布时间】:2020-08-27 20:05:42
【问题描述】:

我有一个函数在页面上抓取一些数据,并将它们存储在变量“结果”中。有几个页面,因此该函数包含在“for”循环中。

const PageScraping = async(page, query) =>{
await page.goto(query, { waitUntil: "networkidle2" });

const result = await page.evaluate(() =>{
        return(
            [...document.querySelectorAll('.card--result__body')].map((o) => ({
                type:
                    o.querySelector('.card__title-link') &&
                    o.querySelector('.card__title-link').innerText,
                price:
                    o.querySelector('.card--result__price > span > .sr-only') &&
                    parseInt(o.querySelector('.card--result__price > span > .sr-only').innerText.replace('€','')),
                rooms:
                    o.querySelector('.card__informations.card--result__informations > .card__information.card--result__information.card__information--property > .abbreviation > .sr-only') &&
                    parseInt(o.querySelector('.card__informations.card--result__informations > .card__information.card--result__information.card__information--property > .abbreviation > .sr-only').innerText.replace(' chambres','')),
                surface:
                    o.querySelector('.card__information.card--result__information.card__information--property') &&
                    parseInt(o.querySelector('.card__information.card--result__information.card__information--property').innerText.split(' ')[4]),
                postcode:
                    o.querySelector('.card__information.card--results__information--locality.card__information--locality') &&
                    o.querySelector('.card__information.card--results__information--locality.card__information--locality').innerText.split(' ')[0],
                url:
                    o.querySelector('.card__title.card--result__title > a') &&
                    o.querySelector('.card__title.card--result__title > a').href,
            }))
            );
        });
return result;

}

之后,我需要将结果存储在另一个包含所有数据的变量中(循环)。那里我使用“推”,但我得到一个错误:

无法读取未定义的属性“push”

    let all_results;
    try{
       let query = 'myurl'
       await page.goto(query, { waitUntil: "networkidle2" });
       let max_pages = parseInt(await page.$eval('.pagination > li:nth-last-child(2) > a > .button__label', o => o.innerText));
       for(let i = 1; i < max_pages+1; i++){
           console.log('page ',i,' of ',max_pages);
           try{
               const result = await PageScraping(page, query);
               query = `urlpage${i+1}`;
               all_results.push(result);
               console.log(all_results);

            } catch(e){
               console.log('ERROR: could not reach landing page',e.message);
           }
       }

   } catch(error) {
       console.log('ERROR: could not reach landing page',error.message);

   } finally {
       try{
           await browser.close();
        }catch(browser_error){
            console.log('ERROR cant close browser??', browser_error.message)
        }
    }
}

【问题讨论】:

  • all_results 是什么?我没有看到它在任何地方定义。
  • 您能告诉我们您在哪里定义了all_results 变量吗?它试图从那里读取它,因为方法只是具有函数类型的属性
  • 定义all_results为数组,push方法是针对数组
  • 我刚刚编辑了包括 all_results 定义的问题
  • 您已声明 all_results,但似乎从未为其赋值 - 所以它当然是undefined,这就是错误正在告诉你。如果您希望它保存一个数组,则必须在某个时候分配适当的数组值。

标签: javascript node.js push puppeteer


【解决方案1】:

以下代码现在正在运行。按照建议,我将“all_results”声明为一个数组。

    let all_results = [];
    try{
       let query = 'myurl'
       await page.goto(query, { waitUntil: "networkidle2" });
       let max_pages = parseInt(await page.$eval('.pagination > li:nth-last-child(2) > a > .button__label', o => o.innerText));
       for(let i = 1; i < max_pages+1; i++){
           console.log('page ',i,' of ',max_pages);
           try{
               const result = await PageScraping(page, query);
               query = `urlpage${i+1}`;
               all_results.push(result);
               console.log(all_results);

            } catch(e){
               console.log('ERROR: could not reach landing page',e.message);
           }
       }

   } catch(error) {
       console.log('ERROR: could not reach landing page',error.message);

   } finally {
       try{
           await browser.close();
        }catch(browser_error){
            console.log('ERROR cant close browser??', browser_error.message)
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多