【问题标题】:NestJs Global HttpExceptionFilter not working properlyNestJs 全局 HttpExceptionFilter 无法正常工作
【发布时间】:2020-04-18 00:09:56
【问题描述】:

您好,我正在尝试使用 NestJs 创建一个 RestFul 应用程序,并且我正在尝试创建一个全局异常过滤器。

基本上我必须有 2 个端点。

  1. /api/user/register
  2. /api/auth/token

每个端点都会引发不同的异常,但我似乎无法使其正常工作。它没有通过我的 ExceptionFilter 类。我错过了什么吗?

如果有人能帮我解决这个问题,我将不胜感激。

非常感谢。

AuthModule.ts

@Module({
  imports: [
    MongooseModule.forFeature([
      {
        name: 'AuthClient',
        schema: AuthClientSchema,
      }
    ]),
  ],
  controllers: [AuthController],
  providers: [
    AuthService,
  ],
})
export class AuthModule { }

UserModule.ts

@Module({
  imports: [
    MongooseModule.forFeature([
      {
        name: 'User',
        schema: UserSchema,
      }
    ]),
  ],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule { }

AppModule.ts

@Module({
  imports: [
    DatabaseModule,
    AuthModule,
    UserModule,
  ],
  providers: [
    {
      provide: APP_FILTER,
      useClass: HttpExceptionFilter,
    }
  ],
})
export class AppModule { }

Controller.ts

export class UserController {
  @Post('register')
  public register(@Body() registerDto: RegisterDto, @Res() res: Response): void {
     return this.userService.create(registerDto);
  }
}

export class AuthController {
  @Post('auth')
  public createToken(@Body() authDto: AuthDto, @Res() res: Response): void {
    this.authService.findByUsername(authDto).then((data) => {
     .....
    })
  }
}

Providers.ts

@Injectable()
export class AuthService {
  async findByUsername(authDto: AuthDto) {
    throw new HttpException('Opps something went wrong', 500);
  }
}

@Injectable()
export class UserService {
  async create(registerDto: RegisterDto) {
    throw new HttpException('Unable to create', 500);
  }
}

HttpExceptionFilter.ts

@Catch(HttpException)
export class HttpExceptionFilter extends BaseExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost): void {

    console.log('<<<<<<>>>>>>>>>>>>>>>>>', exception)
  }
}

main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.setGlobalPrefix('api');

  await app.listen(3000);
}
bootstrap();

回购: click here

【问题讨论】:

  • 可以提供repo吗?
  • @MarekUrbanowicz repo 添加。

标签: typescript nestjs


【解决方案1】:

根据their docs,有两种注入全局异常过滤器的方法。您也可以尝试第二种方法,如下所示:

main.ts

    async function bootstrap() {
      const app = await NestFactory.create(AppModule);

      + const { httpAdapter } = app.get(HttpAdapterHost);
      + app.useGlobalFilters(new HttpExceptionFilter(httpAdapter));

      app.setGlobalPrefix('api');
      await app.listen(3000);
    }

    bootstrap();

【讨论】:

  • 我已经尝试过这种方法,但还是一样,我想已经找到原因了。
【解决方案2】:

以防万一有人遇到这种情况。答案已经在他们的文档中了。

全局范围的过滤器用于整个应用程序,用于每个控制器和每个路由处理程序。

解决方案是通过ObservablePromise 捕获Controller 中的异常。

愚弄我。

【讨论】:

    猜你喜欢
    • 2013-12-12
    • 1970-01-01
    • 2022-11-17
    • 2023-01-19
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多