专栏首页ccf19881030的博客nodejs错误:PayloadTooLargeError: request entity too large

nodejs错误:PayloadTooLargeError: request entity too large

最近在使用Nodejs写POST接口的时候,涉及到客户端在请求体中上传base64编码图片的问题,例如我使用的POST请求,问题描述如下:

接口相关描述

插入车流量记录 接口描述:根据指定条件插入站点记录数据 服务地址:http://127.0.0.1:12082/api/insertCarFlowRecord 请求方式:POST请求 数据格式:JSON 参数格式:

参数名称

参数类型

参数说明

参数数值

RecordID

string

数据唯一编号

SmokeBlackID

string

黑烟车唯一编码

SiteID

int

站点编号

Lane

int

车道号

PassTime

string

通过时间

RegMark

string

车牌号

RegColor

string

车牌颜色

RegCondition

int

车牌识别的可信度

EnvFlagLimite

int

环保标志限行号

0或者1

TailNumLimite

int

尾气数限制

IsSmokeBlack

int

是否黑烟车

0 是 1不是

Speed

string

速度

Acc

string

加速度

CarLen

string

车长

Pic

string

图片

Base64编码

返回格式:

参数名称

参数类型

参数说明

参数数值

rc

boolean

调用是否成功

true或者false

str

string

返回入库成功与否等提示信息

string

使用Postman请求如下的JSON数据:

{
  "RecordID":"1125",
  "SmokeBlackID":"1125",
  "SiteID": 4,
  "Lane": 1,
  "PassTime": "2020-01-01T00:06:00.22",
  "RegMark": "京N896P9",
  "RegColor": "蓝",
  "RegCondition": 89,
  "EnvFlagLimite": 0,
  "TailNumLimite": 0,
  "IsSmokeBlack": "0",
  "Speed": "10",
  "Acc": "2",
  "CarLen": "4",
  "Pic": "/9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAQDAwMDAgQDAwMEBAQFBgoGBgUFBgwICQcKDgwPDg4MDQ0PERYTDxAVEQ0NExoTFRcYGRkZDxIbHRsYHRYYGRj/2wBDAQQEBAYFBgsGBgsYEA0QGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBj/2wBDAgQEBAYFBgsGBgsYEA0QGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBj/wAARCAQ4B4ADASIAAhEBAxEC/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtRKpKqzLhikZyH9W5r1j46f8lV0r/sFx/+hNXj8nRfq3869eLvFNnM1qf/2Q******************=="
}

由于Pic字段的base64编码数据太大,此处我省略了许多。 相应的接口代码如下:

/**
 * 插入车流量信息表CarFlow
 */
router.post('/insertCarFlowRecord', function(req, res) {
  let RecordID = req.body.RecordID;               // 数据唯一编号
  let SmokeBlackID = req.body.SmokeBlackID;       // 黑烟车唯一编号
  let SiteID = req.body.SiteID;                   // 站点编号
  let Lane = req.body.Lane;                       // 车道号
  let PassTime = req.body.PassTime;               // 通过时间
  let RegMark = req.body.RegMark;                 // 车牌号
  let RegColor = req.body.RegColor;               // 车牌颜色
  let RegCondition = req.body.RegCondition;       // 车牌识别的可信度
  let EnvFlagLimite = req.body.EnvFlagLimite;     // 环保标志限行号
  let TailNumLimite = req.body.TailNumLimite;     // 尾气数限制
  let IsSmokeBlack = req.body.IsSmokeBlack;       // 是否黑烟车
  let Speed = req.body.Speed;                     // 速度
  let Acc = req.body.Acc;                         // 加速度
  let CarLen = req.body.CarLen;                   // 车长
  let Pic = req.body.Pic;                         // 图片

  if (RecordID == undefined || SmokeBlackID == undefined || SiteID == undefined || Lane == undefined || 
      PassTime == undefined || RegMark == undefined || RegColor == undefined || 
      RegCondition == undefined || EnvFlagLimite == undefined || TailNumLimite == undefined ||
      IsSmokeBlack == undefined || Speed == undefined || Acc == undefined || CarLen == undefined || Pic == undefined ) {
     return res.send({
       rc: false,
       str: '参数不全或不对,请将信息填充完整!'
     });
  }
  if (IsSmokeBlack != 1 && IsSmokeBlack != 0) {
    return res.send({
      rc: false,
      str: 'IsPass取值为0或1,请重新填写!'
    });
  }
   // 入库前,先判断该RecordID在数据库中是否已经存在
   serviceObj.DBClient.isExistRecordInCarFlowTable(RecordID, function(err, result) {
    if (result === true) {
      return res.send({
        rc: false,
        str: `遥测记录ID '${RecordID}' 已经存在`
      })
    }
  });
  // 如果RecordID不存在,则入库
  serviceObj.DBClient.insertCarFlowRecord(req.body, function(err,result) {
    if (result === true) {
      return res.send({
        rc: true,
        str: '入库成功'
      });
    } else {
      return res.send({
        rc:false,
        str: '入库失败'
      });
    }
  });
});

报错如下:

后来查了一下这个错误,原来是nodejs 服务器,在传输内容或者上传文件时,系统默认大小为100kb,这时,我们需要修改系统限制。 HTTP请求时,POST PUT方法理论上,没有参数大小限制。但实际中在服务器端,会限制HTTP请求的大小。所以会出现带大参数的请求服务器无法响应的情况。 特别是在使用富文本编辑器图片采用Base64编码的情况下,默认的1MB的请求参数大小很容易超过,因此,需要修改HTTP请求的大小限制。 在Node.JS的app.js或者server.js中,在bodyparser中修改这个限制即可:

app.use(bodyParser.json({limit:'100mb'}));
app.use(bodyParser.urlencoded({ limit:'100mb', extended: true }));

修改代码后重启服务程序,在Postman中提交请求,

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go by Example 中文版: 时间

    Go by Example 中文版: 时间 Go 为时间(time)和时间段(duration)提供了大量的支持;这里有一些例子。 Go示例代码如下:

    ccf19881030
  • 使用rapidJson C++库生成JSON字符串

    RapidJSON 是一个 C++ 的 JSON 解析器及生成器,它是腾讯公司开发的一款高效的 C++ JSON 解析/生成器,提供 SAX 及 DOM 风格 ...

    ccf19881030
  • .NET开源工具类库-Masuit.Tools

    (https://www.nuget.org/packages/Masuit.Tools.Core) 包含一些常用的操作类,大都是静态类,加密解密,反射操作,...

    ccf19881030
  • 通过小事例来重温 ES10 几个新特性

    ES10 虽然没有像 ES6 那么多新特性,但 ES10 仍然有一些有用的特性。文本通过简单示例来介绍了 ES10 新出来的特性。通过这种方式,咱们就可以快速理...

    前端小智@大迁世界
  • Python的系统管理_06_pytho

    res =subprocess.Popen(['uname','-sv'],stdout=subprocess.PIPE)

    py3study
  • 花木兰到底好看不,我用Python爬取了几万条评论!

    对于神仙姐姐刘亦菲,估计很多码农都很喜欢,小编也非常喜欢她。从一开始的金粉世家里面的青涩的白秀珠,到天龙八部的神仙姐姐王语嫣,再到仙剑奇侠传里面的赵灵儿,后来挑...

    龙哥
  • es6之块级作用域

    用户1741436
  • c++11:枚举类型(enum)的前向声明(forward declaration)

    在C++11之前,C++标准是不支持枚举类型的前向声明的。我说出这个结论,肯定有用msvc的童鞋不愿意了:口胡,MSVC明明就可以对枚举类型前向声明,下面这样的...

    用户1148648
  • 一天一大 leet

    给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。

    前端小书童
  • 撬动offer:寻找丢失的数字

    Have the function MissingDigit(str) take the str parameter, which will be a simp...

    java乐园

扫码关注云+社区

领取腾讯云代金券