[英]Access the raw body of a request in koa.js
我使用
io.js<\/code>和
koa.js<\/code>創建了一個 API。
作為正文解析器中間件,我使用的是
koa-body<\/code> ,而后者又使用
co-body<\/code> 。
在我的一個 API 端點上,我正在接收
POST<\/code>請求,並且我需要訪問請求的原始正文,因為我需要對其進行編碼以驗證請求是否有效。
有沒有辦法訪問請求的原始正文? 我嘗試使用
raw-body<\/code>中間件,但如果我在調用
koa-body<\/code>之前使用它,則 koa-body 中使用的
co-body<\/code>
koa-body<\/code>會中斷。
如果我在
koa-body<\/code>之后使用它,它就不起作用。
app.use(function*(next){
let rawRequestBody = yield rawBody(this.req);
this.rawRequestBody = rawRequestBody;
yield next;
});
捕獲流一次才有意義。
您可以使用raw-body
實用程序將請求主體捕獲為字符串或緩沖區(我假設這是“raw”主體的意思),然后保留對它的引用,如您自己的代碼所示,這樣:
let rawRequestBody = yield rawBody(this.req);
this.rawRequestBody = rawRequestBody;
console.log(typeof this.rawRequestBody); // "string"
一旦你這樣做,不要也使用koa-body
或co-body
,因為那些也是流捕獲實用程序,假設你還沒有捕獲流。 要使請求體可以作為JSON(例如)訪問,只需執行以下操作:
this.jsonRequestBody = JSON.parse(this.rawRequestBody);
console.log(typeof this.jsonRequestBody); // "object"
為什么我們不能使用多體解析器(co-body,koa-body)是因為通過定義它必須為下一個中間件准備ctx.request.body,這意味着當一個體解析器中間件“await next()”時將控制轉移到下一個中間件ctx.req被消耗(或結束)。
用於與其他請求主體消費者協調的任何主體解析器中間件(一個在ctx.req上監聽“數據”或“結束”事件),必須使其在ctx上“同步”監聽事件(如“數據”或“結束”)。 REQ。 對於在“Promise.resolve()。then”中執行此操作的共同體和koa-body(使用共同體)不是這樣,如果在監聽這些事件之前觸發“數據”或“結束”事件,則數據丟失(丟失“數據”事件)或錯誤(收聽結束流)將發生。
@greim是對的,但大多數時候,我們使用高級中間件(例如joi-router),它有強制使用體解析器中間件而我們無法控制,這仍然是個問題。
在文檔中為此創建一個快速入門代碼示例會很好,但似乎沒有。 這是我的一個工作示例:
const multipartBodyParser = require('koa-body');
const unparsed = require('koa-body/unparsed.js');
const app = new Koa();
app.use(multipartBodyParser({
includeUnparsed: true,
multipart: true,
}));
app.listen(3100);
// Now access the raw request body like this :
ctx.request.body[unparsed];
我在使用 koa-bodyparser 時遇到了類似的問題,問題是外部 webhook 沒有發送 application\/json 內容標頭,因此它沒有解析正文。 我可以通過明確告訴解析器在這條路由上解析 json 來解決這個問題。
.use(bodyParser({
detectJSON: function (ctx) {
return /webhook\/json-route/i.test(ctx.path);
},
}))
您可以通過 ctx.request.rawBody 訪問原始請求正文
ref:在此處輸入鏈接描述
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.