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‘].
  • encode: requested encoding. Default is utf-8 by co-body.
  • 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.
  • textLimit: limit of the text body. Default is 1mb.
  • 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.
  • detectJSON: custom json request detect function. Default is null.
    app.use(bodyparser({
      detectJSON: function (ctx) {
        return /\.json$/i.test(ctx.path);
      }
    }));
  • extendTypes: support extend types:
    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:
    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. 
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
  }
})));

  然后就大功告成了!!!!

    

原文地址:https://www.cnblogs.com/tieshengdetie/p/8601849.html

时间: 2024-08-28 16:15:12

koa-bodyParse 接受post 大表单报错:nodejs Error request entity too large的相关文章

大数据导出报错

1.错误描述 java.lang.IllegalArgumentException:Can not find a java.io.InputStream  with the name [inputStream] in the invocation stack. Check the <param name="inputName"> tag specified for this action 2.错误原因 3.解决办法 大数据导出报错

三个思路解决413 Request Entity Too Large报错处理

最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报错页面时,你会发现有nginx版本信息,经过分析,这报错是因为nginx的默认上传文件大小配置client_max_body_size只有2MB, 基于nginx验证比laravel验证要早,想要友好报错而不是直接显示413 Request Entity Too Large,那么就有三个思路去解决.

WCF入门(一)--Request Entity Too large 传输的数据量过大

通过WCF进行数据的查询或者添加的时候,如果数据量过大,一般会报出如下的错误: 1.已超过传入消息(65536)的最大消息大小配额.若要增加配额,请使用相应绑定元素上的MaxReceivedMessageSize 属性. 2.远程服务器返回了意外反应(413)Request Entity too large. 3.远程服务器返回了意外反应(400)Bad Request. 具体的解决方案: 服务端返回数据给客户端报错 在客户端的配置文件中,主要修改maxReceivedMessageSize <

Laravel 5.4 migrate报错:Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `us ers_email_unique`(`email`))

Laravel 5.4 migrate报错:Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `us     ers_email_unique`(`email`)) public function up() { Schema::create('users', function (Blu

报错:error C2229: class &#39; &#39; has an illegal zero-sized array

结构体的最后一个数组就不会显示错误. 我们写一个程序测试一下: 当指定了数组大小为1的时候,发现b和c的地址是连续的: 给b数组开辟了一个int大小的空间.所以如果不给素组限定大小,那么b和&c的地址就会指向同一处.但如果b是结构体最后一个元素就无所谓了: 输出: 报错:error C2229: class ' ' has an illegal zero-sized array

关于报错“syntax error near unexpected token `”和回车换行

本来是很简单一个事情,转过来是因为打字机这事比较有趣-- http://blog.csdn.net/xyp84/archive/2009/08/11/4435899.aspx 摘要一下: 回车 换行 0D 0A <CR> <LF> Carriage Return Line Feed "/r" "/n" win32 0D 0D 0A unix 0D 0A ============淡定的分割线=============== 今天写了个shell脚

linux下安装php报错configure: error: Cannot find MySQL header files under /usr/include/mysql.

linux下安装php报错configure: error: Cannot find MySQL header files under /usr/include/mysql. 2013-03-04 15:34wdjhz | 分类:服务器软件 | 浏览5318次 configure: error: Cannot find MySQL header files under /usr/include/mysql.Note that the MySQL client library is not bun

Android4.4.4 GZIPOutputStream报错:Stream error

在android 4.4.4 机器上使用网友提供的GZipUtils方法进行GZip压缩,但是会一直报错Stream error.错误位置: public static void compress(InputStream is, OutputStream os) throws Exception { GZIPOutputStream gos = new GZIPOutputStream(os); int count; byte data[] = new byte[BUFFER]; while (

连接mysql报错:error 2003 (hy000):can&#39;t connect to mysql server on &#39;localhost&#39; (10061)

一.mysql 的bin目录下有个MySQLInstanceConfig.exe,运行就可以进行创建数据库实例,创建实例时也可以生成windows 服务,把服务设置成自动启动就可以了 二.安装在D盘的discuzz!打开后出现上述错误,请问应如何处理?winmysqladmin已经启动,但三色树上有一个小红点如果出现"ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)",说明你的MySQL还没有启动.解决办法