我是Node.js和Express.js的新手,希望得到一些指導(dǎo)。
我正在嘗試插入MySQL數(shù)據(jù)庫(kù),其中有名為delivery_order
和delivery_order_item
的表。當(dāng)用戶提交交貨訂單信息(這進(jìn)入前一個(gè)表)時(shí),包括已交付的貨物(貨物將插入后一個(gè)表,其中外鍵為delivery_order_number
),我想插入兩個(gè)表。但是,如果在插入到delivery_order
表的過(guò)程中遇到錯(cuò)誤,貨物也不會(huì)插入到貨物表中,因此beginTransaction
。
例如,當(dāng)我嘗試插入delivery_order
表的一個(gè)重復(fù)主鍵時(shí)(這顯然給了我一個(gè)錯(cuò)誤),代碼仍然會(huì)將貨物插入表中,并且不會(huì)中止整個(gè)過(guò)程。我確保在所有錯(cuò)誤范圍內(nèi)寫入throw err
,但它不起作用。
如有任何建議,將不勝感激。
delivery_order.insert = (data) => {
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 < tableData.length; i++) {
itemValues.push([
formInfo.number,
tableData[i].code,
tableData[i].name,
tableData[i].qty,
tableData[i].unit,
]);
}
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) return reject(err);
connection.beginTransaction((err) => {
if (err) {
connection.rollback(() => {
connection.release();
throw err;
});
}
connection.query(
"INSERT INTO delivery_order SET ?",
formValues,
(err, results) => {
if (err) {
connection.rollback(() => {
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) => {
if (err) {
connection.rollback(() => {
connection.release();
throw err;
});
}
connection.commit(function (err) {
if (err) {
connection.rollback(() => {
connection.release();
throw err;
});
}
connection.release();
return resolve("ok");
});
}
);
}
);
});
});
});
};
如果需要一種簡(jiǎn)單的方法來(lái)停止進(jìn)程,請(qǐng)中止進(jìn)程:
請(qǐng)簡(jiǎn)要說(shuō)明錯(cuò)誤沒(méi)有實(shí)際存在的原因:當(dāng)您拋出錯(cuò)誤時(shí),它會(huì)將錯(cuò)誤返回給正在執(zhí)行給定函數(shù)的任何對(duì)象。從這段代碼中,看起來(lái)您正在創(chuàng)建一個(gè)MySQL引擎執(zhí)行的方法,這將解釋為什么進(jìn)程沒(méi)有退出。MySQL處理錯(cuò)誤的方式可能與普通節(jié)點(diǎn)完全不同。