mongoose NestJS句柄MongoError

7tofc5zh  于 2023-04-21  发布在  Go
关注(0)|答案(1)|浏览(139)

我有一个NestJS应用程序(版本7),它使用mongoose。安装的包是@nestjs/mongoosemongoose
我想创建一个ExceptionFilter来捕获mongoose错误。

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

MongoExceptionFilter

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

问题是我不能从mongodb导入MongoError,因为它不起作用,正如这里提到的。
问题是,我应该从哪里导入这个MongoError,这样NestJS就可以捕获mongoose抛出的错误。从我所看到的mongoose@nestjs/mongoose都没有暴露这个对象。
更新
https://github.com/GeoPablo/nest-demo-mongo-这里是一个GitHub存储库

3npbholx

3npbholx1#

mongoose包导入错误

import { Error } from 'mongoose';

来自官方Mongoose Docs:

  1. Errors in 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只是简单地 Package 了mongoose包,这样,它就可以作为一个可导入的模块使用。它既不修改也不使用mongodb。这就是为什么你仍然需要安装mongoose。所以不会有来自@nestjs/mongoose包的mongo相关错误。至于MongoError,Mongoose处理MongoError并以自己的方式巧妙地呈现它(参考 * Mongoose中的错误 * 链接)并抛出它。我不认为有办法从mongoose包中导入本机MongoError,或者让mongoose抛出本机MongoError,而不是自己的Error。如果有办法的话我会更新的。

  • 上面的代码应该可以工作。我还没有测试过它。但是我建议使用一种存储库模式,在这种模式下,你可以在repo层处理所有与持久化存储(在这种情况下是mongodb和mongoose)相关的异常。我不清楚你的应用程序的上下文,但这是大多数应用程序的最佳实践。*

相关问题