NestJS обрабатывает ошибку MongoError

#node.js #mongoose #nestjs

#node.js #мангуст #nestjs

Вопрос:

У меня есть приложение NestJS (версия 7), которое оно использует mongoose . Установленными пакетами являются @nestjs/mongoose и mongoose .

Я хочу создать ExceptionFilter, который будет улавливать mongoose ошибки.

  @Post('/register')
 @HttpCode(201)
 @UseFilters(MongoExceptionFilter)
 @UsePipes(new ValidationPipe({ whitelist: true }))
 async register(){}
  

И MongoExceptionFilter

 @Catch(MongoError)
export class MongoExceptionFilter implements ExceptionFilter {
......
}
  

Проблема в том, что я не могу импортировать MongoError из mongodb , потому что он не будет работать, как упоминалось здесь .

Вопрос в том, откуда я должен импортировать это MongoError , чтобы NestJS перехватывал ошибки, которые выдает mongoose. Из того, что я вижу, ни mongoose один, ни @nestjs/mongoose один не раскрывает этот объект.

Обновить

https://github.com/GeoPablo/nest-demo-mongo — вот репозиторий GitHub

Комментарии:

1. можете ли вы поделиться своим package.json?

Ответ №1:

Ошибка импорта из пакета mongoose.

import { Error } from 'mongoose';

Из официальных документов Mongoose :

  1. Ошибки в Mongoose
  2. Имена ошибок в Mongoose

В фильтре исключений гнезда :

 import { Error } from 'mongoose';
import { ArgumentsHost, Catch, ExceptionFilter} from '@nestjs/common';

@Catch(Error)
export class MongooseExceptionFilter implements ExceptionFilter {

     constructor(//Dependencies){}

     catch(exception: Error, host: ArgumentsHost) {
         //exception.name will be one of the strings mentioned in the 
         //Error Names in Mongoose link
         const exceptionType = exception.name;
         //handleException...
      }
}
  

Теперь, чтобы ответить на ваш вопрос:

Вопрос в том, откуда я должен импортировать этот MongoError, чтобы NestJS перехватывал ошибки, которые выдает mongoose. Из того, что я вижу, ни mongoose, ни @nestjs /mongoose не раскрывают этот объект.

NestJS просто оборачивает mongoose пакет, чтобы его можно было использовать в качестве импортируемого модуля. Он не изменяет и не работает с mongodb. Вот почему у вас все еще есть install mongoose вместе с ним. Таким образом, из пакета не будет ошибки, связанной с mongo @nestjs/mongoose . Что касается MongoError , Mongoose обрабатывает MongoError и аккуратно представляет его по-своему (см. Ошибки в ссылке Mongoose) и выдает его. Я не думаю, что есть способ импортировать native MongoError из пакета mongoose или сделать mongoose throw native MongoError вместо своего собственного Error . Я не изучал это, я обновлю, если есть способ.

Приведенный выше код должен работать. Я его не тестировал. Но я предлагаю шаблон репозитория, в котором вы обрабатываете все исключения, связанные с постоянным хранилищем (в данном случае mongodb с mongoose) на уровне репозитория. Контекст вашего приложения мне неясен, но это лучшая практика, когда дело доходит до большинства приложений.