import { Controller, Post, Body } from '@nestjs/common';
import { MyService } from 'my.service';
import { MyDto } from './dto/my.dto';
@Controller('my-route')
export class MyController {
constructor(private readonly _myService: MyService) {}
@Post()
async myMethod(@Body() myDto: MyDto) {
console.info(myDto); // undefined
return await this._myService.doStuff(myDto.elementOfInterest); // Passes undefined variable into method.
}
}
Я не понимаю, как правильно получить доступ к данным формы тела из POST в Nest. Документация и примеры демонстрируют простое использование декоратора @Body() перед именем параметра, который будет содержать тело (или конкретный элемент в теле, если параметр используется). Тем не менее, в моем примере выше тело никогда не заполняется, и метод вызывается с неопределенным значением myDto. Даже изменение его типа на строку и простая передача одной пары ключ / значение в теле моего POST оставляет его неопределенным.
Как правильно обрабатывать тела POST в Nest?
Никаких труб или перехватчиков. Я тестировал как в 4.5.10, так и в 4.6.6, и у меня было такое же поведение. Когда я отправляю данные формы на сервер, код выполняется, но параметр body не определен.
Также не забудьте установить заголовок запроса Content-Type в application/json.
Это решило ее.






Комментарий Камиля Мысливца о Content-Type был решением.
Also, keep in mind to set
Content-Typerequest header intoapplication/json.
На случай, если кто-нибудь наткнется на мою проблему.
У меня тоже была эта проблема, но для меня она была связана с настройкой сервера в main.ts.
Я установил этот код, чтобы включить сертификат ssl для работы с https, но только в производстве
let serverOptions = null;
if (environment.production) {
const httpsOptions = {
key: fs.readFileSync(environment.sslKeyPath),
cert: fs.readFileSync(environment.sslCertPath),
};
serverOptions = { httpsOptions };
}
const app = await NestFactory.create(AppModule, serverOptions)
но, видимо, создание сервера с опциями null сломает его.
Поэтому я изменил его на что-то вроде этого, так как он работает с undefined
const app = await NestFactory.create(AppModule, serverOptions ?? undefinded)
в качестве альтернативы сделайте что-то вроде этого, потому что я не знаю, безопасна ли установка параметров на undefined
const app = serverOptions ? await NestFactory.create(AppModule, serverOptions) : await NestFactory.create(AppModule)
Надеюсь, это поможет кому-то с аналогичной проблемой
Вы добавляли какие-нибудь глобальные
PipeилиInterceptor? Я только что сделал быструю проверку из пустого проекта Nest, создав контроллер@Post()с параметром@Body(), и он заработал, как ожидалось. Редактировать - Я просто попробовал ваш точный код, без MyDto и MyService, и он тоже сработал. Какую версию NestJS вы используете?