обработка ошибок исключений TypeORM - PullRequest
5 голосов
/ 20 февраля 2020

Я хочу создать приложение с помощью Nest Js и TypeORM, используя MongoDB. Давайте предположим, что у меня есть объект с двумя уникальными полями, кроме поля идентификатора

@Entity()
export class Module extends BaseEntity {
  @ObjectIdColumn()
  public id: ObjectID;

  @Column({ unique: true })
  public moduleName: string;

  @Column({ unique: true })
  public displayName: string;
}

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

[Nest] 6624   - 2020-02-20 16:31:36   [ExceptionsHandler] E11000 duplicate key error collection: test-mongo.module index: UQ_61128bd419e3c3a6d8d7d565ed9 dup key: { moduleName: "firstModule" } +23849ms
BulkWriteError: E11000 duplicate key error collection: test-mongo.module index: UQ_61128bd419e3c3a6d8d7d565ed9 dup key: { moduleName: "firstModule" }
    at OrderedBulkOperation.handleWriteError (C:\Users\mhermsen\Gitlab Repositories\server\node_modules\mongodb\lib\bulk\common.js:1210:11)
    at resultHandler (C:\Users\mhermsen\Gitlab Repositories\server\node_modules\mongodb\lib\bulk\common.js:519:23)
    at C:\Users\mhermsen\Gitlab Repositories\server\node_modules\mongodb\lib\core\connection\pool.js:404:18
    at processTicksAndRejections (internal/process/task_queues.js:76:11)

Так что в моем операторе catch я должен обработать входящие ошибки. Что мне нужно сделать, это

try {
  // create module
} catch (error) {
  if (/* error is TypeORM error */) {
    if (/* wrong attribute is the module name */) {
      // module name exists ...
    }

    if (/* wrong attribute is the display name */) {
      // display name exists ...
    }
  }
}

Предоставляет ли TypeORM готовые исключения? Могу ли я использовать перечисление? Какой будет хороший подход для извлечения этих ошибок базы данных TypeORM?


Кажется, здесь перечислены некоторые ошибки

https://github.com/typeorm/typeorm/tree/master/src/error

но я не могу импортировать их, и я не нашел ничего о BulkWriteError


В моем операторе catch можно сделать что-то вроде

const code: number = error.code;

if (code === 11000) {
  throw new ConstraintException(error.errmsg);
}

throw error;

, но как вы знаю, что это не лучший подход. Также этот объект ошибки не сообщает мне, является ли moduleName или displayName недействительным. Просто внутри строки

errmsg: 'E11000 Коллекция дубликатов ошибок ключа: test-mon go .module index: UQ_61128bd419e3c3a6d8d7d565ed9 dup key: {moduleName: "firstModule"}',

Должен ли я создавать свое собственное отображение из этих кодов ошибок в исключения?

...