Как отформатировать ошибку записи дубликата mysql?

#mysql #node.js #express #error-handling #mysql2

Вопрос:

Я использую express.js с помощью mysql2.

Когда при вставке возникает ошибка повторяющейся записи, я получаю сообщение об ошибке в глобальном обработчике ошибок, и это работает должным образом.

Когда я регистрирую его в консоли, ошибка выглядит следующим образом:

    Error: Duplicate entry 'todd' for key 'users.username_UNIQUE'
    at PromisePool.execute (C:UsersYTDesktopPORTFOLIOMERNsocial-talkservernode_modulesmysql2promise.js:358:22)
    at C:UsersYTDesktopPORTFOLIOMERNsocial-talkservermodelsUser.js:45:48 {
  code: 'ER_DUP_ENTRY',
  errno: 1062,
  sqlState: '23000',
  sqlMessage: "Duplicate entry 'todd' for key 'users.username_UNIQUE'"
}
 

Моя проблема в том, что я не уверен, как отформатировать эту ошибку, потому что в ней не указано фактическое поле или ключ, который дублируется (имя пользователя), а только это поле sqlMessage, которое не очень хорошо выглядит для отображения пользователям в этом формате.

PS: Я знаю о sequelize, но мне действительно интересно, как я могу это сделать без ORM

Ответ №1:

Я действительно придумал достойное решение.

Поскольку sqlMessage всегда будет в одном и том же формате, я сначала разделил sqlMessage на массив, а затем извлек введенное значение, а затем я также извлек поле, но так как поле имеет формат «database.field_UNIQUE», мне пришлось извлечь поле, которое находится между символами «.» и»_».

Код выглядит так:

 if (err.errno === 1062) {
    const errWords = err.sqlMessage.split(" ");
    const entry = errWords[2];
    const fieldDB = errWords[5];
    const formattedField = fieldDB.substring(fieldDB.lastIndexOf(".")   1, fieldDB.lastIndexOf("_"));
    console.log( `Duplicate entry - ${formattedField}: ${entry}`)
    return res.status(400).json({ error: `Duplicate entry - ${formattedField}: ${entry}` });
}
 

В результате будет:

Дубликат записи — имя пользователя: «тодд»