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);
});
import { json } from 'body-parser';
import * as cloneBuffer from 'clone-buffer';
export const cachedRawBodyRequestKey = 'rawBodyBuffer';
/**
* Clones the request buffer and stores it on the request object for reading later
*/
export const cacheRawBodyOnRequest = json({
verify: (req: any, res, buf, encoding) => {
// only clone the buffer if we're receiving a Xero webhook request
if (req.headers['x-xero-signature'] && Buffer.isBuffer(buf)) {
req[cachedRawBodyRequestKey] = cloneBuffer(buf);
}
return true;
},
});
8条答案
按热度按时间oprakyz71#
我看到这个问题是相当老,但它是列在谷歌第一,所以我想在这里添加答案。
如果你不想添加
body-parser
中间件(例如,你只想在单控制器方法中使用纯文本),你可以使用raw-body
(它已经存在于你的node_modules中),如下所示:你也可以创建新的参数装饰器
把它当作
wqsoz72f2#
添加@yumaa的上述帖子
下面是NestJS v7.0.8中的装饰器:
yk9xbfzb3#
发布请求的语义由指示内容类型的标头确定。请尝试确保请求标头的类型为“text/plain”,并查看此帮助的。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST
holgip5t4#
Nest与纯文本不兼容,您必须将bodyparser传递给Express应用。请尝试以下操作:
其中***选项***是从https://www.npmjs.com/package/body-parser创建的
pgx2nnw85#
上面的装饰器或控制器方法对我不起作用,因为请求主体缓冲区总是已经被读取。
我可以使用下面的中间件让它工作。(注意,在我的例子中,我需要验证一个Xero webhook,所以这个例子是针对这个问题的)
cache-raw-body-on-request.ts:
main.ts:
控制器:
gwo2fgha6#
下面是我对NestJS处理器中原始(文本)主体的看法:
1.使用
preserveRawBodyInRequest
配置应用程序,如JSDoc示例所示1.在处理程序中使用
RawBody
装饰器来检索原始(文本)正文raw-request.decorator.ts:
py49o6xq7#
如果您希望避免额外的第三方依赖项,您还可以使用built-in nodejs方法:
用法:
aydmsdu98#
只需动态地在NestJS中注册一个文本解析器。
您可以使用常见问题部分(https://docs.nestjs.com/faq/raw-body#raw-body)中介绍的
rawBody: true
选项。但是,请注意,默认情况下,仅注册 * jsonParser * 和 * urlencodedParser *。如果您希望注册其他解析器,则需要显式注册。示例:
main.ts:
my.controller.ts: