簡體   English   中英

"在 koa.js 中訪問請求的原始正文"

[英]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-bodyco-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM