#mysql #node.js #express
#mysql #node.js #экспресс
Вопрос:
Я новичок в Node.js и Express.js, и хотел бы получить некоторые рекомендации.
Я пытаюсь выполнить вставку в базу данных MySQL, где есть таблицы с именами delivery_order
и delivery_order_item
. Когда пользователь отправил информацию о заказе на доставку (это входит в первую таблицу), включая доставленные товары (товары будут вставлены в последнюю таблицу, где у нее есть внешний ключ delivery_order_number
), я хотел бы выполнить вставку в обе таблицы. Однако, если при вставке в delivery_order
таблицу обнаружится ошибка, товары также не будут вставлены в таблицу товаров, следовательно beginTransaction
.
Проблема, например, в том, что когда я пытаюсь вставить дубликат первичного ключа delivery_order
таблицы (что, очевидно, приводит к ошибке), коды все равно вставляют товары в ее таблицу и не прерывают весь процесс. Я позаботился о том, чтобы записать throw err
все области ошибок, но это не работает.
Буду признателен за любой совет.
delivery_order.insert = (data) =gt; { const tableData = data.tableData; const formInfo = data.formInfo; var datetime = new Date(formInfo.date); datetime = moment(datetime).format("YYYY-MM-DD"); var duetime = new Date(formInfo.due); duetime = moment(duetime).format("YYYY-MM-DD"); let formValues = { number: formInfo.number, name: formInfo.name, address: formInfo.address, date: datetime, due: duetime, city: formInfo.city, note: formInfo.note, }; let itemValues = []; for (var i = 0; i lt; tableData.length; i ) { itemValues.push([ formInfo.number, tableData[i].code, tableData[i].name, tableData[i].qty, tableData[i].unit, ]); } return new Promise((resolve, reject) =gt; { pool.getConnection((err, connection) =gt; { if (err) return reject(err); connection.beginTransaction((err) =gt; { if (err) { connection.rollback(() =gt; { connection.release(); throw err; }); } connection.query( "INSERT INTO delivery_order SET ?", formValues, (err, results) =gt; { if (err) { connection.rollback(() =gt; { connection.release(); throw err; // Code still continues down there and doesn't abort even after getting an error here. }); } connection.query( "INSERT INTO delivery_order_item (delivery_order_number, code, name, qty, unit) VALUES ?", [itemValues], (err, results) =gt; { if (err) { connection.rollback(() =gt; { connection.release(); throw err; }); } connection.commit(function (err) { if (err) { connection.rollback(() =gt; { connection.release(); throw err; }); } connection.release(); return resolve("ok"); }); } ); } ); }); }); }); };