koa-bodyParse 接受post 大表單報錯:nodejs Error request entity too large

  Node.js從2009橫空出世以後,至今已經7年有餘,各類web框架也林林總總,目前大約在npm上有35萬左右包,刨去前端和一些無心義的封裝,也是有很是可觀的優秀的模塊的。其中web框架也是特別搶眼的,從早期的express到如今koa,對異步流程控制的改進前仆後繼。隨着移動端崛起面向api的框架hapi和restify也如火如荼,更有一些面向特性的框架,好比thinkjs對es6/es7/typescript支持,總體來講,質量都是很是不錯的,算百花齊放,仍是那句話,即便不優化,你也能用這些框架得到較高的性能。

  本公司技術轉型,嘗試用nodejs 做爲web-server,做爲一名phper的我,對「php是世界上最好的語言」深信不疑,卻又不得不放下執念,縱身跳入node學習的苦海當中,本覺得苦海無涯懸崖勒馬,然柳暗花明,得以窺探node的博大精深之處,越陷越深不能自拔。因此本文主要記錄下我的在學習使用node過程當中遇到的各類問題和所填的坑。
  
  koa 基於nodeJs 平臺的下一代web開發框架
  koa 是由 Express 原班人馬打造的,致力於成爲一個更小、更富有表現力、更健壯的 Web 框架。 
  koa-bodyParse 解析body 的中間件,用以接受post 過來的表單,json數據,或者上傳的文件流。
  如下是配置項說明:
  
  • enableTypes:  parser will only parse when request type hits enableTypes, default is ['json', 'form'].javascript

  • encode: requested encoding. Default is utf-8 by co-body.php

  • formLimit: limit of the urlencoded body. If the body ends up being larger than this limit, a 413 error code is returned. Default is 56kb.前端

  • jsonLimit: limit of the json body. Default is 1mb.java

  • textLimit: limit of the text body. Default is 1mb.node

  • strict: when set to true, JSON parser will only accept arrays and objects. Default is true. See strict mode in co-body. In strict mode, ctx.request.body will always be an object(or array), this avoid lots of type judging. But text body will always return string type.git

  • detectJSON: custom json request detect function. Default is null.es6

    app.use(bodyparser({
      detectJSON: function (ctx) {
        return /\.json$/i.test(ctx.path);
      }
    }));

     

  • extendTypes: support extend types:github

    app.use(bodyparser({
      extendTypes: {
        json: ['application/x-javascript'] // will parse application/x-javascript type body as a JSON string 
      }
    }));

     

  • onerror: support custom error handle, if koa-bodyparser throw an error, you can customize the response like:web

    app.use(bodyparser({
      onerror: function (err, ctx) {
        ctx.throw('body parse error', 422);
      }
    }));

     

  • disableBodyParser: you can dynamic disable body parser by set ctx.disableBodyParser = true. typescript

app.use(async (ctx, next) => {
  if (ctx.path === '/disable') ctx.disableBodyParser = true;
  await next();
});
app.use(bodyparser());
    可是,本人在項目開發過程當中由於業務需求,須要一次性的提交很大的表單,而後就碰到了以下錯誤:
    
    
nodejs Error request entity too large
 
    而後只能抱但願於強大的百度,基本給出的解決辦法是這樣的:
    
var koaBody = require('koa-bodyParse')({
    "formLimit":"5mb",
    "jsonLimit":"5mb",
    "textLimit":"5mb"
});

  可是所有試事後,卵用沒有,仍是報錯,因而開始追koa-bodyParse代碼,終於發現問題所在:

  

  koa-bodyParse 依然依賴 co-body,raw-body,並用qs 模塊來處理url中的參數(post 提交也會序列化成標準化url),因而查詢qs 模塊的官方文檔找到這麼一句話:

 

  qs 模塊是能夠配置解析字符串時的參數個數的,上圖中opts.queryString 只是一個默認的空對象,也就是默認的參數爲1000個,當你的表單過大超過這個1000時,不管你怎麼配置koa-bodyParse 都是沒用的 ,因而解決方案以下,在你的node入口文件引用koa-bodyParse的地方增長配置:

  

app.use(convert(bodyParser({
  enableTypes:['json', 'form', 'text'],
  formLimit:"3mb",
  queryString:{
    parameterLimit:100000000000000
  }
})));

  而後就大功告成了!!!!

相關文章
相關標籤/搜索