UnhandledPromiseRejectionWarning: необработанное отклонение обещания при запуске сценария кукловода - PullRequest
0 голосов
/ 28 марта 2020

Я получаю UnhandledPromiseRejectionWarning: необработанное отклонение обещания при выполнении простого поиска в сети с кукловодом, я использовал точно такой же код в других проектах, и он работал, я не знаю, почему он не работает сейчас. Полная ошибка следующей строки:

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. Эта ошибка возникла либо в результате выброса внутри асинхронной функции c без блока 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 голосов
/ 16 апреля 2020

Ваш вызов page.$x (после await ed) не возвращает одну итерацию с хотя бы одним элементом ИЛИ первый элемент возвращаемой итерации - undefined. Таким образом, el или el2 (в зависимости от линии, которой они являются) присваивается undefined. Поскольку undefined не имеет свойства getProperty, оно выбрасывает. Вы не видите эту ошибку, поэтому обратите внимание.

Как сказал @Jaromanda X, используйте try / catch внутри функции async. Или, поскольку async функции возвращают Promise, используйте scrapeChannel('https://www.youtube.com/user/Microsoft').catch( /**/ ); для перехвата любых ошибок внутри этой функции, избегая Node.js UnhandledPromiseRejectionWarning.

...