首页 > 解决方案 > 如何使用 NestJS 将纯文本作为我的请求正文传递?

问题描述

我的 NestJS 应用程序中的控制器方法之一应该将纯文本作为其主体,但每当我尝试发出请求时,参数都会作为空对象接收。这甚至可能吗,还是我必须创建某种 DTO 来传递该单个字符串?

例子:

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

标签: javascripttypescripthttppostmannestjs

解决方案


我看到这个问题很老了,但它在谷歌中排名第一,所以我想在这里添加答案。

如果您不想添加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) {
  // ...

(我没有检查装饰器代码,在评论中写在这里)


推荐阅读