Задать вопрос
@hatealleverything

Как реализовать асинхронность запросов в базу данных на Express.js ( MySql )?

Добрый день. Столкнулся с такой проблемой. Есть условие, если в базе данных уже существует такой идентификатор, то мы обновим имя в этой строке. Если такого идентификатора нет, то мы добавим идентификатор и имя. Я смог это реализовать, но когда я начал тестировать и заходить и выходить из аккаунта у меня постоянно выскакивала ошибка ( Подключение к базе данных закрыто ). Я понял, что тут не обойтись без асинхронности запросов, начал разбираться в Promise, но проблема осталась. Не могу найти хорошую документацию по Промисам или какое-либо видео. Могли бы вы подсказать как это можно реализовать и где ошибки или подсказать хороший источник по промисам для Express.js. За исключением Metanit, я прочитал статью про pool, но на свой вопрос так и не смог найти ответ.

Вот, что получилось у меня набросать для того, чтобы вообще это сделать.

// pool.query('SELECT * FROM users WHERE vkontakteid = ?', [req.user.id])
// console.log('Подключение к бд успешно, условие выполнено')

// results.length === 0

// const data = [req.user.id, req.user.displayName]
// pool.execute('INSERT INTO users (vkontakteid, name) VALUES (?,?)', data)
// console.log('Данные добавлены')

// const data = [req.user.displayName, req.user.id];
// pool.execute('`UPDATE users SET name=? WHERE vkontakteid=?`', data)
// console.log('Данные обновлены')


Тут я попробовал всё это преобразовать в нормальный код, но это условие у меня вообще не проверяется
if (result.lenght === 0)
И автоматически выводится сразу же else

pool.query('SELECT * FROM users WHERE vkontakteid = ?', [req.user.id], console.log('Подключение к бд успешно, условие выполнено'))
            .then(result => {
                if (result.lenght === 0) {
                    const data = [req.user.id, req.user.displayName]
                    return pool.execute('INSERT INTO users (vkontakteid, name) VALUES (?,?)', data, console.log('Данные добавлены'))
                } else {
                    const data = [req.user.displayName, req.user.id];
                    return pool.execute('UPDATE users SET name=? WHERE vkontakteid=?', data, console.log('Данные обновлены'))
                }
            })
            .then(result => {
                console.log(result[0]);
                pool.end();
            })
            .then(() => {
                console.log("пул закрыт");
            })
            .catch(function(err) {
                console.log(err.message);
            });


И опять же ошибка из-за которой я начал всем этим заниматься.
( Я просто вхожу в аккаунт, потом выхожу и снова вхожу, и эта ошибка появляется )
Я понимаю, почему она появляется, но я уже многое перепробовал и не знаю, что ещё можно попробовать.

5f02edff1c784273639063.jpeg
  • Вопрос задан
  • 427 просмотров
Подписаться 3 Средний 16 комментариев
Пригласить эксперта
Ответы на вопрос 1
Fragster
@Fragster
помогло? отметь решением!
Конкретно эта задача решается через https://dev.mysql.com/doc/refman/8.0/en/insert-on-...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы