UnhandledPromiseRejectionWarning:运行操纵up脚本时未处理的承诺拒绝

时间:2020-03-28 00:54:13

标签: javascript node.js web-scraping promise puppeteer

我得到一个UnhandledPromiseRejectionWarning:在使用puppeteer进行简单的Web抓取时,未处理的Promise拒绝被拒绝,我在另一个项目中使用了完全相同的代码,并且它起作用了,我不知道为什么它现在不起作用。下一行完整错误:

node .\scrapers.js
(node:9748) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'getProperty' of undefined
    at scrapeChannel (C:\Users\João Teixeira\OneDrive\code\learning\js\webscrapingapp\server\scrapers.js:10:27)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

(node:9748) UnhandledPromiseRejectionWarning: Unhandled promise rejection。该错误是由于在没有catch块的情况下抛出异步函数而引起的,或者是由于拒绝了未经.catch()处理的诺言而引起的。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志--unhandled-rejections=strict(请参见https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝ID:1)

(node:9748) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated.

将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

这是代码:

const puppeteer = require('puppeteer')

async function scrapeChannel(url) {

    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url);

    const [el] = await page.$x('//*[@id="text"]');
    const text = await el.getProperty('textContent');
    const name = await text.jsonValue();

    const [el2] = await page.$x('//*[@id="img"]');
    const src = await el2.getProperty('src');
    const avatarURL = await src.jsonValue();
    console.log({name, avatarURL})
    browser.close();

    return {name, avatarURL}
}
scrapeChannel('https://www.youtube.com/user/Microsoft');

1 个答案:

答案 0 :(得分:0)

您对page.$x的调用(在await之后)没有返回带有至少一个元素的可迭代对象,或者返回的可迭代对象的第一个元素是undefined。 因此,elel2(取决于它们所在的行)被分配了undefined。由于undefined没有属性getProperty,因此会抛出。您没有发现该错误,因此请注意。

正如@Jaromanda X所说,在try函数内使用catch / async。或者,由于async函数返回一个Promise,请使用scrapeChannel('https://www.youtube.com/user/Microsoft').catch( /**/ );捕获该函数内部发生的任何错误,避免使用Node.js UnhandledPromiseRejectionWarning