Функция Start и Restart asyn c с setIntervalAsyn c возвращает TypeError не может преобразовать undefined или null в объект - PullRequest
0 голосов
/ 09 мая 2020

Я пытался реализовать веб-парсер, который будет использовать данные, извлеченные из MongoDB, для создания массива URL-адресов для периодического парсинга с помощью кукольника. Я пытаюсь заставить мою функцию парсера периодически очищать, используя setIntervalAsyn c.

Вот мой код прямо сейчас, который выдает "UnhandledPromiseRejectionWarning: TypeError: невозможно преобразовать undefined или null в объект в Function.values. .. "

кукловод. js

 async function scrape(array){      
            // initialize for loop here
            let port = '9052'
            if(localStorage.getItem('scrapeRunning')=='restart'){
                clearIntervalAsync(scrape)
                localStorage.setItem('scrapeRunning') == 'go'
            }else if(localStorage.getItem('scrapeRunning') != 'restart'){
            /// Puppeteer scrapes urls in array here ///
}

сервер. js

app.post('/submit-form', [
        // Form Validation Here //
    ], (req,res)=>{

        async function submitForm(amazonUrl,desiredPrice,email){
            // Connect to MongoDB and update entry or create new entry
            // with post request data
            createMongo.newConnectToMongo(amazonUrl,desiredPrice,email)
            .then(()=>{
                // Set local variable that will alert scraper to clearIntervalAsync///
                localStorage.setItem('scrapeRunning','restart');
                // before pulling the new updated mongoDB data ...
                return createMongo.pullMongoArray();

            })
            .then((result)=>{
                // and start scraping again with the new data
                puppeteer.scrape(result)
            })
        submitForm(req.body.amazonUrl, req.body.desiredPrice,req.body.email);
     }
}

createMongo.pullMongoArray()
.then((result)=>{
    setIntervalAsync(puppeteer.scrape, 10000, result);
})

В настоящее время парсер запускается, как ожидалось, после запуска сервера и держит 10 секунд между окончанием очистки и ее повторным началом. После отправки сообщения коллекция MongoDB обновляется данными сообщения, создается элемент localStorage, но функция очистки сходит с рельсов и выдает ошибку typeError. Я не уверен, что происходит, и пробовал несколько способов исправить это (включая оставление setIntervalAsyn c и clearIntervalAsyn c внутри блока кода почтового запроса), но пока безуспешно. Я новичок в кодировании и крайне неопытен с асинхронным кодом, поэтому, если у кого-то есть опыт работы с такого рода проблемами и он может пролить свет на то, что происходит, я был бы очень признателен! 1015

1 Ответ

0 голосов
/ 09 мая 2020

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

кукловод. js

let timer;

function start(result){
    timer = setIntervalAsync(scrape,4000, result)
}

function stop(){
    clearIntervalAsync(timer)
}


async function scrape(array){       
        // initialize for loop here
        let port = '9052'
        // Puppeteer scrapes urls from array here //
}

Я изменил свой серверный код a немного, поэтому при запуске сервера он получает результаты от MongoDB и использует их в функции запуска скребка. Почтовый запрос также вызывает функцию остановки перед обновлением MongoDB, извлекает новый результат из MongoDB и затем вызывает функцию запуска скребка.

сервер. js

createMongo.pullMongoArray()
.then((result)=>{
    puppeteer.start(result);
})

app.post('/submit-form', [
        // Form Validation In Here //
    ], (req,res)=>{

        async function submitForm(amazonUrl,desiredPrice,email){
            // Stop the current instance of the scrape function
            puppeteer.stop();
            // Connect to MongoDB and update entry or create new entry
            // with post request data
            createMongo.newConnectToMongo(amazonUrl,desiredPrice,email)
            .then(()=>{
                // before pulling the new updated mongoDB data ...
                console.log('Pulling New Array');
                return createMongo.pullMongoArray();
            })
            .then((result)=>{
                // and restarting the repeating scrape function
                puppeteer.start(result);
            })
      }
})
...