@hatealleverything

Как можно реализовать вывод ID из базы данных в переменную?

pool.getConnection(function(err, connect) {

            connect.query('SELECT * FROM users WHERE vkontakteid = ?', [req.user.id], function(err, result) {

                if (err) console.log(err);

                else {
                    if (result.length === 0) {
                        const data = [req.user.id, req.user.displayName]
                        connect.execute('INSERT INTO users (vkontakteid, name) VALUES (?,?)', data)
                        console.log('Вы были зарегистрированы')
                    } else {
                        const data = [req.user.displayName, req.user.id];
                        connect.execute('UPDATE users SET name=? WHERE vkontakteid=?', data)
                        console.log('Такой пользователь уже существует')
                        console.log(result)
                    }
                }

            }, pool.releaseConnection(connect))
        })
        res.redirect('/')


5f040e3cd7d6b618025262.jpeg

Можно ли как-то вывести этот id в переменную?
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 1
@ElijahCapricorn
Можно просто создать переменную перед вызовом getConnection

let id;
pool.getConnection(function(err, connect) {
    connect.query(..., function(err, result) {
        ...
        if(!err && result.length !== 0) {
            id = result.id;
        }
        ...
    }
}

Но из-за того, что запросы к БД асинхронные Вы не сможете узнать когда значение запишется в переменную.

По этой причине в асинхронные функции передают коллбэк, который на вход получит результат выполнения асинхронного кода.
function createOrUpdateUsersCallback(err, result) {
    if (err) {
		console.log(err);
	}
	else {
		// Use result.id as you want
	}
}

function createOrUpdateUsers(callback) {
	pool.getConnection(function(err, connect) {
		connect.query(..., function(err, result) {
			if(err) {
				callback(err, null);
			}
			else {
				// Do create or update 
				callback(null, result);
			}

		}
	}
}

createOrUpdateUsers(createOrUpdateUsersCallback);

Но в современном мире с асинхронным кодом проще всего работать через промисы и async/await
На промисах это будет что-то вроде
const createOrUpdateUsersPromise = new Promise((resolve, reject) => {
	function createOrUpdateUsers(callback) {
		pool.getConnection(function(err, connect) {
			connect.query(..., function(err, result) {
				if(err) {
					reject(err);
				}
				else {
					// Do create or update 
					resolve(result);
				}

			}
		}
	}
})

const result = await createOrUpdateUsersPromise();
const id = result.id;
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы