Как использовать правильный подход к обработке роутов в NestJS?

Как правильно обрабатывать роуты вида hostname.com/users/password/edit или hostname.com/users/password/new, чтобы избежать ошибки со статусом 400, сообщающей о неправильной валидации (ожидается числовая строка)?
  • 26 октября 2023 г. 7:48
Ответы на вопрос 1
В NestJS для обработки роутов можно использовать Decorators и Pipes.

1. Создайте кастомный Pipe (преобразователь), который будет обрабатывать и валидировать параметры роутов. В вашем случае, чтобы избежать ошибки со статусом 400 при ожидании числовой строки для параметра в пути, вы можете создать числовой Pipe и использовать его для валидации параметра.

Например, создайте `NumericPipe`, который будет проверять, является ли параметр числом:

```typescript
import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';

@Injectable()
export class NumericPipe implements PipeTransform {
  transform(value: string): number {
    const numericValue = Number(value);
    if (Number.isNaN(numericValue)) {
      throw new BadRequestException('Value should be a numeric string');
    }
    return numericValue;
  }
}
```

2. Создайте контроллер и добавьте роуты с использованием кастомного Pipe. В вашем случае, для роутов вида `hostname.com/users/password/edit` и `hostname.com/users/password/new`, вы можете использовать параметр, требующий валидацию числовой строки:

```typescript
import { Controller, Get, Param, ParseIntPipe } from '@nestjs/common';
import { NumericPipe } from './numeric.pipe';

@Controller('users')
export class UsersController {
  @Get(':id/edit')
  editUser(@Param('id', NumericPipe) id: number) {
    // Обрабатывайте роут /users/:id/edit с валидным числовым id
  }

  @Get(':id/new')
  newUser(@Param('id', NumericPipe) id: number) {
    // Обрабатывайте роут /users/:id/new с валидным числовым id
  }
}
```

В этом примере `NumericPipe` используется вместо стандартного `ParseIntPipe` для проверки, является ли параметр числом. Если параметр не является числом, будет выброшено исключение `BadRequestException` со статусом 400.

Таким образом, при обращении к `hostname.com/users/password/edit` или `hostname.com/users/password/new` с невалидным числовым параметром, будет выброшено исключение со статусом 400.
Похожие вопросы