javascript - 如何使用 NestJS 将纯文本作为我的请求正文传递?
问题描述
我的 NestJS 应用程序中的控制器方法之一应该将纯文本作为其主体,但每当我尝试发出请求时,参数都会作为空对象接收。这甚至可能吗,还是我必须创建某种 DTO 来传递该单个字符串?
例子:
@Post()
myFunction(@Body() id: string) {
// do something here
}
解决方案
我看到这个问题很老了,但它在谷歌中排名第一,所以我想在这里添加答案。
如果您不想添加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) {
// ...
(我没有检查装饰器代码,在评论中写在这里)
推荐阅读
- navigation - Amlogic Android 9.0 遥控器导航问题
- wordpress - 在我的导航中为模式框添加按钮
- sql - 计算 UNPIVOT 中两列之间的差异
- javascript - 如何编写 FullPage.js 脚本?
- postgresql - `pg_ls_dir` 可以查询某些目录,但不能查询其他目录
- css - 如何在不使用内容容器的情况下在 Bulma 中的标题前创建间距
- c# - 如何在不添加重复项的情况下移动一个形状?
- android - Xamarin.Forms.Android:在编译/部署时使用示例数据文件填充“Environment.SpecialFolder.Personal”
- c - 为什么使用 & 运算符时 char* 和 char[x] 之间的区别很重要
- tensorflow - 值错误:形状不匹配 - 使用 tensorflow 时