NestJs - 捕捉与自定义过滤器和@Catch(MongoError)MongoDB的错误

问题描述 投票:0回答:1

我使用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的这是为什么不工作了更新?

javascript node.js mongodb typescript nestjs
1个回答
1
投票

这是因为你将所有错误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> {
© www.soinside.com 2019 - 2024. All rights reserved.