在koa.js中访问请求的原始主体
我使用io.js
和koa.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-body
或co-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中间件,我们无法控制,这仍然是一个问题。