Как я могу использовать переменную, сохраненную из соединения mysql с NodeJS в асинхронную функцию? - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь очистить сайт с Кукольником. Я хочу выбрать дату последнего поста, вставленного в мою базу данных, и сравнить его с датами, взятыми скребком, чтобы я мог видеть, есть ли пост в базе данных (используя дату в качестве ссылки, чтобы увидеть, была ли она изменена) ).

Вот мой код:

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'db_webcrawler_coches'
});

connection.connect((err) => {
    if (err) throw err;
    console.log('Connected!');
});

let lastpublishedDate;
let idCoches;
connection.query("SELECT id_coches, publish_date FROM coches ORDER BY publish_date DESC limit 1", function (err, row) {
    if (err) throw err;
    lastPublishedDate =  row[0].publish_date;
    idCoches = row[0].id_cochesNet;
    console.log("Published in", lastPublishedDate);
    console.log("Id Coches", idCoches);
});

const run = async () => {
    try {
        const options = {
            headless: false,
        };

        ...

            const news = await page.evaluate(() => {
                const idsList =  [...document.querySelectorAll('div.mt-SerpList-item')].map(elem => elem.getAttribute("id")).filter(elem => elem.includes("#"))
                const datePost = [...document.querySelectorAll('span.mt-CardAd-date')].map(elem => elem.innerText);

                    for(let i = 0; i < titlesCar.length; i++){
                        const finalDate = parsedDates[i];
                        if (finalDate > lastPublishedDate || idCoches !== idsList[i]){
                            console.log("Not repeated");

                            const carsList[i] = [
                                idsList[i],
                                parsedDates[i]
                            ]
                        } else {
                            console.log("Repeated")
                        }
                    }
                return carsList;

            });

            ...


  } catch (err) {

        console.log(err);
        await browser.close();
        console.log("Browser Closed");
    }
  };

run();

Как вы можете видеть, я хочу видеть, совпадает ли дата с идентификатором, взятым из запроса. Тем не менее, появляется ошибка, которая говорит Оценка не удалась: ReferenceError: переменная "lastPublishedDate" не определена , и я думаю, что это будет то же самое с "idCoches". Я написал несколько console.logs, чтобы увидеть, когда он падает, и кажется, что это происходит, когда достигает функция "news" . Я не уверен, если это потому, что это объем или из-за функции. Как вы думаете, что я должен сделать, чтобы это работало?

Может ли это быть сферой? Спасибо!

РЕДАКТИРОВАТЬ: РЕШЕНО! Я публикую его на тот случай, если кто-нибудь столкнется с подобной проблемой. Действительно, это была сфера, это проблема, связанная с кукловодом. Кажется, что функция с page.evaluate () не может взять какую-либо переменную за ее пределами. Чтобы изменить его, нужно добавить page.evaluate следующим образом: await page.evaluate ((variable_1, variable_2) => {/ * ... * /}, variable_1, variable_2);

1 Ответ

0 голосов
/ 27 апреля 2020

Обратный вызов вашего запроса, вероятно, еще не вернулся, когда запущена функция asyn c, поэтому все ваши попытки ссылаться не определены. Я не уверен, поддерживает ли ваш mysql клиент обещания, но если это так, вы можете сделать что-то вроде этого:

const run = async () => {
   const row = await connection.query("SELECT id_coches, publish_date FROM coches ORDER BY publish_date DESC limit 1")
   lastPublishedDate =  row[0].publish_date;
   idCoches = row[0].id_cochesNet;

   ...

}

Если это не сработает, вы также можете запустить все внутри обратного вызова запроса , Надеюсь, это поможет.

...