首页 > 解决方案 > NestJS 处理 MongoError

问题描述

我有一个正在使用的 NestJS 应用程序(版本 7)mongoose。安装的包是@nestjs/mongoosemongoose

我想创建一个可以捕获mongoose错误的 ExceptionFilter。

 @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 存储库

标签: node.jsmongoosenestjs

解决方案


从 mongoose 包导入错误。

import { Error } from 'mongoose';

来自官方 Mongoose 文档:

  1. 猫鼬中的错误
  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 抛出的错误。据我所知,猫鼬和@nestjs/mongoose 都没有暴露这个对象。

NestJS 只是简单地包装了这个mongoose包,这样它就可以用作一个可导入的模块。它既不修改也不与 mongodb 一起使用。这就是为什么你仍然需要安装猫鼬。所以不会有来自@nestjs/mongoose包的 mongo 相关错误。至于MongoError,Mongoose 处理MongoError并以自己的方式巧妙地呈现它(请参阅Mongoose链接中的错误)并抛出它。我认为没有办法MongoError从 mongoose 包中导入 native 或让 mongoose throw nativeMongoError而不是它自己的Error. 没研究过,有办法再更新。

上面的代码应该可以工作。我没有测试过。但我建议使用存储库模式,您可以在其中处理 repo 层中的所有持久存储(在本例中为 mongodb 和 mongoose)相关的异常。我不清楚您的应用程序的上下文,但它是大多数应用程序的最佳实践。


推荐阅读