【问题标题】:NestJS Handle MongoErrorNestJS 处理 MongoError
【发布时间】:2021-01-06 04:59:03
【问题描述】:

我有一个 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,因为它不起作用,如here 所述。

问题是,我应该从哪里导入这个MongoError,这样NestJS 才能捕捉到猫鼬会抛出的错误。据我所知,mongoose@nestjs/mongoose 都没有暴露这个对象。

更新

https://github.com/GeoPablo/nest-demo-mongo - 这是一个 GitHub 存储库

【问题讨论】:

  • 你能分享你的 package.json 吗?

标签: node.js mongoose nestjs


【解决方案1】:

从 mongoose 包导入错误。

import { Error } from 'mongoose';

来自官方 Mongoose 文档:

  1. Errors in Mongoose
  2. Error Names in 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 一起使用。这就是为什么你仍然需要安装猫鼬。所以不会有来自 @nestjs/mongoose 包的 mongo 相关错误。至于MongoError,Mongoose 处理MongoError 并以自己的方式巧妙地呈现它(请参阅Mongoose 中的错误 链接)并抛出它。我认为没有办法从 mongoose 包中导入原生 MongoError 或让 mongoose 抛出原生 MongoError 而不是它自己的 Error。没研究过,有办法再更新。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 2023-04-10
    • 2019-09-29
    • 2023-03-22
    • 2020-06-09
    • 2021-06-27
    相关资源
    最近更新 更多