Nestjs 中使用 typeorm、sql 进行错误处理

问题描述 投票:0回答:1

我正在 Nestjs 中编写一个服务,它使用 typeorm 与 MySQL 服务器进行通信。假设我创建一个表

test_table
,其中有两列
col1
col2
col1
具有
UNIQUE
约束。

如果尝试插入重复值,我会收到如下错误:

{
  query: 'INSERT INTO `test_table`(`col1`, `col2`) VALUES (?, ?)',
  parameters: [ 'test-val-1', 'test-val-2' ],
  driverError: {
    code: 'ER_DUP_ENTRY',
    errno: 1062,
    sqlState: '23000',
    sqlMessage: "Duplicate entry 'test-val-1' for key 'test_table.col1'",
    sql: "INSERT INTO `test_table`(`col1`, `col2`) VALUES ('test-val-1', 'test-val-2')"
  },
  code: 'ER_DUP_ENTRY',
  errno: 1062,
  sqlState: '23000',
  sqlMessage: "Duplicate entry 'test-val-1' for key 'test_table.col1'",
  sql: "INSERT INTO `test_table`(`col1`, `col2`) VALUES ('test-val-1', 'test-val-2')"
}

如果我返回

sqlMessage
它会公开表名称和列名称,我不会明确获得错误列的名称。

有没有办法以某种格式提取信息,以便我可以获得导致错误的列名称以及它导致什么错误?

我能想到的解决方案有两种:

  • 在尝试插入之前通过访问数据库来检查重复条目。由于额外的数据库调用,它会增加延迟。

  • 或者我可以编写一个解析器,从消息中提取相关信息,但这似乎太过分了,因为如果消息由于某种原因发生变化,它就会中断。

mysql error-handling nestjs typeorm
1个回答
0
投票

解析sqlMessage确实是某种废话。而且,多条记录可能存在冲突。预检查也不是最好的选择。

只需为 errno: 1062 编写一个错误处理程序即可。您可以使用 try catch。在处理器中查找有问题的记录。我认为这是最佳解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.