lun*_*una 3 javascript http typescript postman nestjs
NestJS应用程序中的一种控制器方法应该以纯文本为主体,但是每当我尝试发出请求时,该参数都会作为一个空对象接收。这是否有可能,或者我将不得不创建某种DTO来传递单个字符串?
例:
@Post()
myFunction(@Body() id: string) {
// do something here
}
Run Code Online (Sandbox Code Playgroud)
这是 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)
我看到这个问题已经很老了,但是它在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)
(我没有检查装饰代码,而是在注释中写在这里)
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |