# 项目背景
使用nodejs + koa2 搭建服务器,客户端向服务端发送消息,消息体以json格式传输。
# 问题:
客户端发送的json消息超过1M时,平台未处理相关请求
首先想到的是服务器显示了包体大小,于是修改koa中body部分的配置:maxFieldsSize 字段
修改如下:
.use(body({
multipart: true,
formidable: {
maxFieldsSize: 1000 * 1024 * 1024,
maxFileSize: 1024 * 1024 * 1024, // 限制默认最大上传大小1G 不添加这个限制条件的话 默认最大上传文件大小是2M
keepExtensions: true
},
multiples: false // 限制上传一个文件
}))
然而设置无效,依旧收不到设备的请求。
让客户端打印了下服务器的返回状态码,返回如下
413 Payload err
搜索这个错误的时候看到下面这篇文章
node.js 的express服务器报 413 payload too large
var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
按照其方法修改后,服务器编译后报错,再观察koa文件配置发现:
import body from 'koa-body';
想来这个koa-body应该已经集成了body-parser的功能,在koa-body中应该也有json和urlencode的配置,找到koa-body调用的地方
.use(body({
multipart: true,
formidable: {
maxFieldsSize: 1000 * 1024 * 1024,
maxFileSize: 1024 * 1024 * 1024, // 限制默认最大上传大小1G 不添加这个限制条件的话 默认最大上传文件大小是2M
uploadDir: config.dir.upload,
keepExtensions: true
},
multiples: false // 限制上传一个文件
}))
点击multipart跳链进入源码,恰好上面就有个jsonLimit,默认值1mb
/**
* {String|Integer} The byte (if integer) limit of the JSON body, default 1mb
*/
jsonLimit?: string|number;
/**
* {String|Integer} The byte (if integer) limit of the form body, default 56kb
*/
formLimit?: string|number;
/**
* {String|Integer} The byte (if integer) limit of the text body, default 56kb
*/
textLimit?: string|number;
/**
* {String} Sets encoding for incoming form fields, default utf-8
*/
encoding?: string;
/**
* {Boolean} Parse multipart bodies, default false
*/
multipart?: boolean;
修改为3mb后,服务器成功收到客户端的消息。
.use(body({
multipart: true,
jsonLimit: '3mb',
formidable: {
maxFieldsSize: 1000 * 1024 * 1024,
maxFileSize: 1024 * 1024 * 1024, // 限制默认最大上传大小1G 不添加这个限制条件的话 默认最大上传文件大小是2M
keepExtensions: true
},
multiples: false // 限制上传一个文件
}))