Настройка параметров по умолчанию в NestJS

Вопрос или проблема

У меня есть метод контроллера ниже, который я хочу вызывать так, как я хочу вызывать метод, например, add/1:

@Controller()
export class MyController {

  @Post('add/:id')
  async add(@Body() data: MyData, @Query('id') id?: number) {
     console.log(id);
     //...
  }
}

Можно ли добиться этого, не модифицируя Controller на Controller('add') ?

Попробуйте заменить @Query на @Param

@Post('add/:id')
  async add(@Body() data: MyData, @Param('id') id?: number) {
     console.log(id);
     //...
  }

Ответ или решение

Конечно! Давайте рассмотрим вашу задачу в контексте использования NestJS. Вы хотите вызвать метод контроллера по адресу add/1, при этом передав параметр id, но при этом вы не хотите изменять аннотацию контроллера, чтобы она выглядела как @Controller('add').

В вашем изначальном примере вы использовали @Query('id'), что не совсем подходит, так как id является сегментом URL, а не параметром запроса. Чтобы извлечь параметр id из URL, нужно использовать @Param.

Вот исправленный код вашего контроллера:

import { Controller, Post, Body, Param } from '@nestjs/common';

@Controller()
export class MyController {

  @Post('add/:id')
  async add(@Body() data: MyData, @Param('id') id: string) { // Заменяем @Query на @Param
    console.log(id);
    // Дальнейшая обработка...
    return { id, data }; // Например, возвращаем id и полученные данные
  }
}

Пояснения:

  1. Использование @Param: Вместо @Query вы используете @Param('id'). Это позволяет вам извлекать параметры из пути URL. В данном случае id будет доступен как строка. Если вам нужно работать с числовым значением, вы можете конвертировать его в number, как это делается ниже:

    const numericId = Number(id);
  2. Поддержка других форматов запроса: Метод все еще будет принимать тело запроса, которое содержит данные в соответствии с вашим объектом MyData. Убедитесь, что структура MyData соответствует ожиданиям вашего метода.

  3. Требования к выводам: Помните, что при работе с контроллерами в NestJS обычно предполагается возвращение ответов, в вашем случае вы можете вернуть либо обработанные данные, либо статус выполнения.

С помощью этого кода вы сможете успешно вызывать ваш метод как POST /add/1, и параметр id будет корректно передан в ваш метод контроллера.

Оцените материал
Добавить комментарий

Капча загружается...