gpt4 book ai didi

javascript - NestJs - 使用自定义过滤器和 @Catch(MongoError) 捕获 MongoDB 错误

转载 作者:行者123 更新时间:2023-12-03 00:16:19 29 4
gpt4 key购买 nike

我正在使用 NestJS 通过 MongoDB 创建自定义 API。我有以下设置:

  // users.controller.ts

@Post('sign-up')
@UseFilters(MongoExceptionFilter)
async signUp(@Body() createUserDto: CreateUserDto): Promise<any> {
return await this.userService.signUp(createUserDto).catch(error => {
throw new BadRequestException(error);
});
}
  // user.service.ts

async signUp(createUserDto: CreateUserDto): Promise<User> {
const createUser = new this.userModel(createUserDto);
return await createUser.save();
}
  // mongo-exception.filter.ts

import { ArgumentsHost,Catch, ConflictException, ExceptionFilter } from '@nestjs/common';
import { MongoError } from 'mongodb';

@Catch(MongoError)
export class MongoExceptionFilter implements ExceptionFilter {
catch(exception: MongoError, host: ArgumentsHost) {
console.log('>>>>>>>>>>>>>>>>>>>> exception: ', exception);
}
}
  // package.json
"dependencies": {
"@nestjs/common": "^5.4.0",
"@nestjs/core": "^5.4.0",
"@nestjs/jwt": "^0.2.1",
"@nestjs/mongoose": "^5.2.2",
"@nestjs/passport": "^5.1.0",
"@nestjs/typeorm": "^5.2.2",
"fancy-log": "^1.3.3",
"mongoose": "^5.4.7",
"nestjs-config": "^1.3.0",
"passport": "^0.4.0",
"passport-http-bearer": "^1.0.1",
"passport-jwt": "^4.0.0",
"reflect-metadata": "^0.1.12",
"rimraf": "^2.6.2",
"rxjs": "^6.2.2",
"typeorm": "^0.2.12",
"typescript": "^3.0.1",
"util": "^0.11.1"
},

现在,每当我对/sign-up 路由进行 POST 调用时,都应该在 user.service.ts 中调用 save() 。这一切都有效。接下来,当我再次发布/sign-up 路由时,它应该会触发 MongoDB 错误,因为具有相同电子邮件地址的用户已经存在(电子邮件地址是唯一的,因此有重复的键)。当我只是在 .catch(err => ...); 中记录错误时,我看到错误被抛出,但问题是自定义 MongoExceptionFilter 。我不会触发 MongoError。当我将 @Catch() 留空时,它会触发但无法处理异常。

我做错了什么?自从我看到this发布并使用它作为基础,我似乎无法让它发挥作用。这是 Mongoose 或 NestJS 的更新吗?为什么它不再起作用了?

最佳答案

这是因为你将所有错误都转换为 BadRequestExceptions,这样你的 MongoExceptionFilter 就不会负责;它检查 instanceof MongoError ,对于 BadRequestException 返回 false:

return await this.userService.signUp(createUserDto).catch(error => {
throw new BadRequestException(error);
});

这发生在异常过滤器运行之前;他们总是最后跑。

<小时/>

从 Controller 中删除.catch()。如果您确实想将所有其他异常转换为 BadRequestExceptions (400),那么您可以编写第二个异常过滤器,它处理 MongoExceptionFilter 未处理的所有异常:

@Catch()
export class BadRequestFilter implements ExceptionFilter {
catch(exception: Error, host: ArgumentsHost) {
const response = host.switchToHttp().getResponse();
response.status(400).json({message: exception.message});
}
}

@Catch(MongoError)
export class MongoFilter implements ExceptionFilter {
catch(exception: MongoError, host: ArgumentsHost) {
const response = host.switchToHttp().getResponse();
if (exception.code === 11000) {
response.status(400).json({ message: 'User already exists.' });
} else {
response.status(500).json({ message: 'Internal error.' });
}
}
}

然后将两者添加到您的 Controller (顺序很重要!):

@UseFilters(BadRequestFilter, MongoFilter)
async signUp(@Body() createUserDto: CreateUserDto): Promise<any> {

关于javascript - NestJs - 使用自定义过滤器和 @Catch(MongoError) 捕获 MongoDB 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54523160/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com