NestJS - Как получить доступ к телу сообщения с помощью декоратора @Body ()?

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?

Вы добавляли какие-нибудь глобальные Pipe или Interceptor? Я только что сделал быструю проверку из пустого проекта Nest, создав контроллер @Post() с параметром @Body(), и он заработал, как ожидалось. Редактировать - Я просто попробовал ваш точный код, без MyDto и MyService, и он тоже сработал. Какую версию NestJS вы используете?

VinceOPS 29.04.2018 17:38

Никаких труб или перехватчиков. Я тестировал как в 4.5.10, так и в 4.6.6, и у меня было такое же поведение. Когда я отправляю данные формы на сервер, код выполняется, но параметр body не определен.

Nate Gardner 30.04.2018 04:59

Также не забудьте установить заголовок запроса Content-Type в application/json.

Kamil Myśliwiec 01.05.2018 10:01

Это решило ее.

Nate Gardner 01.06.2018 17:39
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
14
4
16 392
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Комментарий Камиля Мысливца о Content-Type был решением.

Also, keep in mind to set Content-Type request header into application/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)

Надеюсь, это поможет кому-то с аналогичной проблемой

Другие вопросы по теме