Как передать простой текст в качестве тела запроса с помощью NestJS? - PullRequest
0 голосов
/ 11 сентября 2018

Один из методов контроллера в моем приложении NestJS должен принимать в качестве тела простой текст, но всякий раз, когда я пытаюсь сделать запрос, параметр принимается как пустой объект.Это вообще возможно, или мне придется создать какой-то DTO для передачи этой единственной строки?

Пример:

@Post()
  myFunction(@Body() id: string) {
    // do something here
  }

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Nest несовместим с обычным текстом или текстом, и вместо этого вы должны передать bodyparser в ваше экспресс-приложение. Попробуйте что-то вроде этого:

import * as bodyParser from 'body-parser';


async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(bodyparser({ ...options })) // for plain/text bodies
  await app.listen(3000)
}
bootstrap();

где параметры создается из https://www.npmjs.com/package/body-parser

0 голосов
/ 08 января 2019

Я вижу, что этот вопрос довольно старый, но он указан в Google в числе первых, поэтому я хочу добавить ответ здесь.

Если вы не хотите добавлять body-parser промежуточное ПО (например,, вы хотите простой текст только в методе с одним контроллером), вы можете использовать raw-body (который уже существует в ваших node_modules), что-то вроде этого:

import * as rawbody from 'raw-body';
import { Controller, Post, Body, Req } from '@nestjs/common';

@Controller('/')
export class IndexController {

  @Post()
  async index(@Body() data, @Req() req) {

    // we have to check req.readable because of raw-body issue #57
    // https://github.com/stream-utils/raw-body/issues/57
    if (req.readable) {
      // body is ignored by NestJS -> get raw body from request
      const raw = await rawbody(req);
      const text = raw.toString().trim();
      console.log('body:', text);

    } else {
      // body is parsed by NestJS
      console.log('data:', data);
    }

    // ...
  }

}

вы также можете создать новый декоратор параметров

import * as rawbody from 'raw-body';
import { createParamDecorator, HttpException, HttpStatus } from '@nestjs/common';

export const PlainBody = createParamDecorator(async (data, req) => {
  if (req.readable) {
    return (await rawbody(req)).toString().trim();
  }
  throw new HttpException('Body aint text/plain', HttpStatus.INTERNAL_SERVER_ERROR);
});

и используйте его как

@Post()
async index(@PlainBody() text: string) {
  // ...

(я не проверял код декоратора, написал прямо здесь, в комментарии)

0 голосов
/ 12 сентября 2018

Семантика почтового запроса определяется заголовком, который указывает тип контента.Убедитесь, что заголовок запроса имеет тип 'text / plain', и посмотрите, как это помогает.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST

...