admin管理员组文章数量:1123089
NestJs
我使用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"
},
现在,每当我做一个POST调用/签了路线,save()
应在user.service.ts
调用。这所有的作品。接下来,当我张贴的/签了另一路线时应该触发MongoDB的错误,因为有相同的电子邮件地址的用户已经(电子邮件地址是唯一的,因此重复键)。我看到的时候我只是记录错误的.catch(err => ...);
错误被抛出,但问题是自定义MongoExceptionFilter
。我不会对MongoError触发。当我离开@Catch()
空白它触发,但无法处理的例外。
我究竟做错了什么?因为我看到this后和以此为基础,我似乎无法得到它的工作。它是猫鼬或NestJS的这是为什么不工作了更新?
回答如下:这是因为你将所有错误BadRequestExceptions
让你MongoExceptionFilter
将不承担责任;它会检查instanceof MongoError
返回一个BadRequestException
错误:
return await this.userService.signUp(createUserDto).catch(error => {
throw new BadRequestException(error);
});
这种情况发生的异常过滤器运行之前;他们总是在最后执行。
从你的控制器中删除.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.' });
}
}
}
然后双方到控制器(!顺序很重要)地址:
@UseFilters(BadRequestFilter, MongoFilter)
async signUp(@Body() createUserDto: CreateUserDto): Promise<any> {
本文标签: NestJs
版权声明:本文标题:NestJs 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1713143852a809434.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论