在koa.js中访问请求的原始主体

我使用io.jskoa.js创build了一个API。

作为一个身体分析器中间件,我正在使用koa-body ,而koa-body又使用了co-body

在我的一个API端点上,我收到POST请求,并且需要访问请求的原始正文,因为我需要对其进行编码以validation请求是否有效。

有没有办法访问请求的原始内容? 我试图使用raw-body中间件,但是如果在我称之为koa-body之前使用它, koa-body co-body使用的koa-body就会中断。 如果我在koa-body后使用它,它不起作用。

  app.use(function*(next){ let rawRequestBody = yield rawBody(this.req); this.rawRequestBody = rawRequestBody; yield next; }); 

编辑:

我认为我find了解决办法,但我不知道这是否是最好的解决scheme。 我认为@greim答案可能是解决这个问题的更好方法。

我在使用koa-body之前添加了以下代码:

 app.use(function *(next) { let url = this.req.url; if(this.req.method == 'POST') { let that = this; this.req.rawBody = ''; this.req.on('data', function(chunk) { that.req.rawBody += chunk; }); } yield next; }); 

只有一次捕获stream才有意义。

您可以使用raw-body实用程序将请求主体捕获为string或缓冲区(我假定这就是“raw”body的意思),然后按照您自己的代码所示的那样保存对它的引用:

 let rawRequestBody = yield rawBody(this.req); this.rawRequestBody = rawRequestBody; console.log(typeof this.rawRequestBody); // "string" 

一旦你这样做了,不要使用koa-bodyco-body ,因为这些也是stream捕获工具,假设你还没有捕获到stream。 为了使请求体可以像JSON一样访问(例如),只需执行以下操作:

 this.jsonRequestBody = JSON.parse(this.rawRequestBody); console.log(typeof this.jsonRequestBody); // "object" 

为什么我们不能使用多体parsing器(co-body,koa-body)是因为定义它必须为下一个中间件准备ctx.request.body,这意味着当一个parsing器中间件“await next()”将控制转移到下一个中​​间件ctx.req被消耗(或结束)。

任何与其他请求身体消费者(在ctx.req上监听“数据”或“结束”事件)的身体parsing器中间件必须使它在ctx上“同步”监听事件(如“数据”或“结束”)。 REQ。 对于在Promise.resolve()中执行的co-body和koa-body(使用co-body),这是不正确的,如果在一个监听这些事件之前触发“data”或“end” (丢失“数据”事件)或错误(结束stream上的侦听)将会发生。

@greim是对的,但是大多数情况下,我们使用高级中间件(比如joi-router),它使用了一个body parser中间件,我们无法控制,这仍然是一个问题。