如何使用NestJS将纯文本作为请求正文传递?

lun*_*una 3 javascript http typescript postman nestjs

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

例:

@Post()
  myFunction(@Body() id: string) {
    // do something here
  }
Run Code Online (Sandbox Code Playgroud)

Dor*_*onG 7

添加上面@yumaa的帖子

这是 NestJS v7.0.8 的工作装饰器:

import { createParamDecorator, ExecutionContext, BadRequestException } from '@nestjs/common';
import * as rawBody from "raw-body";

export const PlainBody = createParamDecorator(async (_, context: ExecutionContext) => {
    const req = context.switchToHttp().getRequest<import("express").Request>();
    if (!req.readable) { throw new BadRequestException("Invalid body"); }

    const body = (await rawBody(req)).toString("utf8").trim();
    return body;
})
Run Code Online (Sandbox Code Playgroud)


yum*_*maa 6

我看到这个问题已经很老了,但是它在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);
    }

    // ...
  }

}
Run Code Online (Sandbox Code Playgroud)

您还可以创建新的参数装饰器

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);
});
Run Code Online (Sandbox Code Playgroud)

并像这样使用

@Post()
async index(@PlainBody() text: string) {
  // ...
Run Code Online (Sandbox Code Playgroud)

(我没有检查装饰代码,而是在注释中写在这里)