Транзакции в Nodejs + mySQL - как перехватить ошибку
Есть таблица InnoDB с уникальным индексом по двум полям. Есть код, который должен выполнить update записи и вернуть callback вызывающей процедуре. Соответственно я ожидаю, что если будет попытка вставки, нарушающая уникальность, то я перехвачу ошибку и через callback извещу пользователя. И что программа, естественно, продолжит работу.
Код элементарный, практически калька из readme.md пакета:
db.updateDevice = function (devices, callback) {
var device = devices[0];
db.connection.beginTransaction(function (err) {
if (err) {
callback(false, err);
//throw error;
return;
}
db.connection.query("UPDATE devices SET ? WHERE id = ?",
[device, device.id], function (error, results, fields) {
if (error) {
return db.connection.rollback(function () {
//callback(false, error);
throw error;
});
}
db.connection.commit(function (err) {
if (err) {
return db.connection.rollback(function () {
//callback(false, err);
throw error;
});
} else {
callback(true, false);
return;
}
});
});
});
}
Комментарии - мои эксперименты. Что бы я не пробовал, при возникновении ошибки апдейта, программа падает.
Mar 31 08:55:06 vrp node[38109]: /usr/local/bin/node_4/node_modules/mysql/lib/protocol/Parser.js:437
Mar 31 08:55:06 vrp node[38109]: throw err; // Rethrow non-MySQL errors
Mar 31 08:55:06 vrp node[38109]: ^
Mar 31 08:55:06 vrp node[38109]: Error: ER_DUP_ENTRY: Duplicate entry '1-09928b18-80a0-11eb-aba4-309c23b04267' for key 'in_use_driver_id'
Конечно же есть
db.connection.on('error', function (err) {
console.log('db error', err);
});
но туда ход не доходит.
Скажите, что я делаю неправильно.