#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}` });
}
В результате будет:
Дубликат записи — имя пользователя: «тодд»