node.js - NestJS 处理 MongoError
问题描述
我有一个正在使用的 NestJS 应用程序(版本 7)mongoose
。安装的包是@nestjs/mongoose
和mongoose
。
我想创建一个可以捕获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 存储库
解决方案
从 mongoose 包导入错误。
import { Error } from 'mongoose';
来自官方 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)相关的异常。我不清楚您的应用程序的上下文,但它是大多数应用程序的最佳实践。
推荐阅读
- docker - 我可以同时运行 Kubernetes 和 Swarm 吗?
- mysql - 正确查询以获取 7 天中前 5 天的平均值?
- c# - 当用户从该单元格更改值时更新单元格值
- tfs - 如何从 Microsoft.TeamFoundation.WorkItemTracking.Client 访问 git 提交
- php - PHP 数组值到数组 ID
- google-app-engine - 谷歌应用引擎启动器“没有选定的项目正在运行,所以我们没有什么可浏览的”
- c# - 在触摸 ARCore 上添加平面边界点?
- java - 当我从 Netbeans 运行 JFrame 程序时印地语字体可见,但在运行 .jar 文件时不可见
- docker - Docker运行多个主机端口不工作
- ios - 无法在真实设备上检查 IOS webview 中的元素