Транзакции в 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);
});

но туда ход не доходит.

Скажите, что я делаю неправильно.


Ответы (0 шт):