#javascript #mysql #node.js #node-mysql #nodejs-server
Вопрос:
У меня есть следующий код в NodeJS, который хорошо работает для;
- Начните транзакцию MySQL;
- Создайте аудиопост;
- Обновите аудиопост.
- Проверьте, существует ли tag1, а если нет, создайте его и вставьте в таблицу тегов. Если он существует, просто вставьте его в таблицу тегов.
- Зафиксируйте транзакцию;
Но теперь я хотел бы также проверить наличие tag2 и tag3. К сожалению, я не могу понять, где и как разместить блок фиксации, чтобы сохранить все это как единую транзакцию.
Если я поставлю его непосредственно перед закрытием проверки на «tag1», код не дойдет до «tag2» и «tag3». Но если я поставлю это после, то закрывающие скобки в запросах на подключение окажутся в неправильном месте. Вот код;
var mysql = require("mysql");
var express = require("express");
var connection = require("../database");
var createAudiopost = function(req, res, next){
var title = req.body.title;
var userid = req.body.userid;
var opid = req.body.opid;
var tag1 = req.body.tag1;
var tag2 = req.body.tag2;
var tag3 = req.body.tag3;
connection.beginTransaction(function(err) {
if (err) { throw err; }
connection.query('INSERT INTO ?? (title,userid,opid) VALUES (?, ?, ? )', ['audioposts',title,userid,opid], function(err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
var audioname = userid '-' result.insertId '.m4a';
var newid = result.insertId;
console.log("newid: " , newid );
connection.query('UPDATE ?? SET audioname=? WHERE audioid = ?', ['audioposts',audioname,newid], function (error, result, fields) {
if (err) {
connection.rollback(function() {
throw err;
});
}
if (tag1) {
connection.query('SELECT tagid FROM tags WHERE tagname = ?', [tag1], function (error, result, fields) {
if (err) {
connection.rollback(function() {
throw err;
});
}
const tagid1 = result[0].tagid;
if (result < 1) {
connection.query('INSERT INTO tags SET tagname = ?', [tag1], function (error, result, fields) {
if (err) {
connection.rollback(function() {
throw err;
});
}
console.log("lets see this ridiculous result", result);
const tagInsertId = result.insertId;
connection.query("INSERT INTO entitytag SET audioid = ?, tagid = ?, userid = ?", [newid, tagInsertId, userid], function (error, result, fields) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.commit(function(err) {
if (err) {
connection.rollback(function() {
throw err;
});
}
console.log('success!');
newid = result.insertId;
res.json({
"title" : title,
"userid" : userid,
"opid" : opid,
"insertid": newid
}); //resjson success
}); //commit
}); // insert entitytags
}); // insert tags
} // if row
else {
connection.query("INSERT INTO entitytag SET audioid = ?, tagid = ?, userid = ?", [newid, tagid1, userid], function (error, result, fields) {
if (err) {
connection.rollback(function() {
throw err;
}); //err
} //err
connection.commit(function(err) {
if (err) {
connection.rollback(function() {
throw err;
});
}
console.log('success!');
res.json({
"title" : title,
"userid" : userid,
"opid" : opid,
"insertid": newid,
"tag1": tag1
}); //resjson success
}); //commit
}) // insert entitytag2
}
}); //select tagid
}//tag1
}); //update
}); //insert
}); //begin transaction
} //createaudiopost
module.exports = createAudiopost;
Есть какие-либо предложения о том, как я могу завершить такую сложную транзакцию? Мне в основном нужно повторить весь раздел if (tag1)
для tag2 и tag3.
Комментарии:
1. Первое, что я бы сделал, чтобы решить эту проблему, — это покинуть ад обратного вызова. Используйте пакет mysql, который поддерживает обещания , и соответствующим образом перепишите свой код. Таким образом, вам будет намного проще организовать свой код.
2. ОК. Итак, я экспериментирую с обещаниями, но как мне получить вставку возвращаемых строк? Вот что я попробовал ; mydb.query( str_sql_1 ) .затем( строки => { row_a = строки; var newid = row_a[0].insertId; верните mydb.query( str_sql_2 ); } )
3. Если я это сделаю
const res = await connection.query('INSERT INTO table (`colname`) VALUES (123);');
, я смогу сделатьconsole.log(res[0].insertId);
это, чтобы получить новое удостоверение личности. Я предлагаю использоватьawait
, потому что таким образом вы можете писать «синхронный» код и не попадать в проблемы с областью действия.