Вопрос или проблема
У меня есть метод контроллера ниже, который я хочу вызывать так, как я хочу вызывать метод, например, 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 и полученные данные
}
}
Пояснения:
-
Использование @Param: Вместо
@Query
вы используете@Param('id')
. Это позволяет вам извлекать параметры из пути URL. В данном случаеid
будет доступен как строка. Если вам нужно работать с числовым значением, вы можете конвертировать его вnumber
, как это делается ниже:const numericId = Number(id);
-
Поддержка других форматов запроса: Метод все еще будет принимать тело запроса, которое содержит данные в соответствии с вашим объектом
MyData
. Убедитесь, что структураMyData
соответствует ожиданиям вашего метода. -
Требования к выводам: Помните, что при работе с контроллерами в NestJS обычно предполагается возвращение ответов, в вашем случае вы можете вернуть либо обработанные данные, либо статус выполнения.
С помощью этого кода вы сможете успешно вызывать ваш метод как POST /add/1
, и параметр id
будет корректно передан в ваш метод контроллера.