Nest Js Global HttpExceptionFilter не работает должным образом - PullRequest
0 голосов
/ 14 апреля 2020

Здравствуйте. Я пытаюсь создать приложение RestFul, используя Nest Js, и пытаюсь создать глобальный фильтр исключений.

В основном мне нужно 2 конечные точки.

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

Каждая конечная точка выдает свое исключение, но я не могу заставить его работать. Это не go через мой класс 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();

Репо: нажмите здесь

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

На всякий случай, если кто-то сталкивается с этим. Ответ уже есть в их документах.

Глобальные фильтры используются во всем приложении, для каждого контроллера и каждого обработчика маршрута.

Решение состоит в том, чтобы поймать исключение в Controller на Observable или Promise.

тупой меня.

0 голосов
/ 17 апреля 2020

Согласно их документам существует два способа внедрения глобальных фильтров исключений. Вы также можете попробовать второй способ, как показано ниже для вашего случая:

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();
...