как правильно работать с mysql в nodejs

Рейтинг: 0Ответов: 1Опубликовано: 01.08.2025

что-то понять не могу как правильно работать с подключением к mysql

const pool = mysql.createPool({
    connectionLimit: 5,
    host: "127.0.0.1",
    user: "sdfsdfs",
    database: "dfgsdfs",
    password: "1243242"
}).promise();
pool.execute('SELECT * FROM sites WHERE ?', [1]).then(result=>{
    result[0].forEach( (resrow) => {
        sites[resrow.site_id] = resrow;
        sites_ids.push(resrow.site_id);
    });
}).then(result=>{
    return pool.execute('SELECT * FROM sites_users WHERE `active` = 1 AND site_id IN (?)', [sites_ids.join(', ')])
}).then(result =>{
    for (var i in result[0]){
        if(typeof sites_users[result[0][i].site_id] === 'undefined') {sites_users[result[0][i].site_id] = [];}
        sites_users[result[0][i].site_id].push(result[0][i].user_id);
    }
    Object.values(sites).forEach(async (site) => {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();

        await page.goto(site.url);
        const elementText = await page.evaluate(() => {
            // Выбираем элемент, текст которого нужно получить
            const element = document.querySelector('title');
            // Возвращаем текстовый контент элемента
            return element.textContent;
        });
        if(site.title != elementText){
            pool.execute('UPDATE sites SET title="?" WHERE site_id=?', [elementText, site.site_id]);
        }
        await browser.close();
    });
}).then(result =>{
    pool.end();
})

UPDATE уже не срабатывает, говорит Pool is closed видимо в логике ошибка, или постоянно открывать новое подключение к mysql является нормальной практикой?

Ответы

▲ 1Принят

В итоге ошибка в логике. forEach уходит в асинк и инструкции после него производятся не дожидаясь его конца. Для того, чтобы дождаться окончания всех async действий и только после этого завершить подключение к БД я использовал конструкцию

    const promises = Object.values(sites).map(checkSite);
    await Promise.allSettled(promises);
    pool.end();

где checkSite это async функция обрабатывающая данные из sites.