如何格式化 mysql 重复输入错误?

How to format a mysql duplicate entry error?

我正在使用 express.js 和 mysql2。

当插入时发生重复输入错误时,我在全局错误处理程序中收到错误并且按预期工作。

当我将其记录到控制台时,错误如下所示:

   Error: Duplicate entry 'todd' for key 'users.username_UNIQUE'
    at PromisePool.execute (C:\Users\YT\Desktop\PORTFOLIO\MERN\social-talk\server\node_modules\mysql2\promise.js:358:22)
    at C:\Users\YT\Desktop\PORTFOLIO\MERN\social-talk\server\models\User.js:45:48 {
  code: 'ER_DUP_ENTRY',
  errno: 1062,
  sqlState: '23000',
  sqlMessage: "Duplicate entry 'todd' for key 'users.username_UNIQUE'"
}

我的问题是我不确定如何格式化这个错误,因为它没有给出重复的实际字段或键 (username),但只是这个 sqlMessage 字段,以这种格式向用户显示不是很好看。

PS:我知道 sequelize,但我真的很想知道如何在没有 ORM 的情况下做到这一点

其实我想出了一个不错的解决方案。

因为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}` });
}

结果将是:

Duplicate entry - username: 'todd'