#mysql #sql #node.js #express #transactions
#mysql #sql #node.js #экспресс #транзакции
Вопрос:
У меня есть цепочка запросов, созданных с использованием транзакции.
- вставьте нового пользователя. Из результата я получаю idUser
- вставьте новый адрес. Из результата я получаю idAdress.
- вставьте новый user_address (используя idUser и idAddress).
Поэтому мне нужно дождаться продолжения каждого выполнения, потому что результат первого запроса не определен!
connection.beginTransaction(function (err) {
if (err) {
next(createError.Unauthorized("Sql query error")); //! or error.message
}
var idUser;
var idAddress;
//insert user
sql =
"INSERT INTO users (email, password) "
"VALUES ( ?, ?)";
param = [email, password];
connection.query(sql, param, function (error, results, fields) {
if (error) {
connection.rollback(function () {
return next(createError.Unauthorized("Sql query error"));
});
//MY TEST: results is undefined
console.log(results);
//get the id
idUser = results.insertId;
//insert user
sql =
"INSERT INTO addresses (country, city) "
"VALUES ( ?, ?)";
param = [country, city];
connection.query(sql, param, function (error, results, fields) {
if (error) {
connection.rollback(function () {
return next(createError.Unauthorized("Sql query error"));
});
// get the id
idAddress = results.insertId;
//insert user_address
sql =
"INSERT INTO user_address (idUser, idAddress) "
"VALUES ( ?, ?)";
param = [idUser, idAddress];
connection.query(sql, param, function (error, results, fields) {
if (error) {
connection.rollback(function () {
return next(createError.Unauthorized("Sql query error"));
});
//commit
connection.commit(function (err) {
if (err) {
connection.rollback(function () {
next(createError.Unauthorized("Sql query error"));
});
});
});
});
});
});
Комментарии:
1. При этом используется код обратного вызова. Действительно пора переключиться на использование Promises и
async
/await
или as, это значительно облегчит вашу жизнь. Еще лучше, используйте функции со стрелками, например(...) => { ... }
, в предпочтении кfunction(...) { ... }
2. ye @tadman ты знаешь, как это реализовать с помощью Promises ?!
3. Я бы рекомендовал использовать что-то вроде Sequelize для вашего уровня базы данных, и он изначально поддерживает promises. Многие другие драйверы работают так же, поэтому вам придется проверить документацию для того, который вы используете.