Express 服务器在使用大字符串执行 post / put 请求时发送 500 错误代码
Express server sends 500 error code when doing post / put request with large string
当我使用 nodejs
+ express
和 body-parser
包在服务器端管理我的路由和数据时,我正在构建一个小项目。
在前端,我有一个简单的 react
应用程序,它安装了 tinyMCE
编辑器。
问题是当我将 select 图像插入文档时,编辑器将其设为 base64
blob,当我尝试保存包括该 base64 图像在内的更改时(通过向服务器发出 PUT 请求)节点吐出错误 500。
一开始我认为它是应用程序 json headers 的问题,正如 git 问题主题之一所建议的那样。
所以我切换到
"Content-Type": "application/x-www-form-urlencoded"
但问题依然存在。
然后我尝试使用一些小图像 16x16
(之前是 340x300
)并且它有效...
所以这可能意味着 POST 在数据部分中有太多字符,但我认为限制是 1.9GB
。
这是一些服务器代码示例:
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
router.put("/:id", update);
const update = (req, res, next) => {
documentController.update(req, res, next);
};
const update = async (req, res, next) => {
const { name } = req.body;
const document = await Document.findOne({ name });
...
document
.save()
.then(document => {
...
})
.catch(err => next(err));
};
和前端请求:
request = async (url, method, data) => {
try {
let headers = {
//"Content-Type": "application/json"
"Content-Type": "application/x-www-form-urlencoded"
};
let config = {
headers,
method
};
if (data !== undefined) {
//config["body"] = data;
let query = "";
data = JSON.parse(data);
for (let key in data) {
query +=
encodeURIComponent(key) + "=" + encodeURIComponent(data[key]) + "&";
}
query = query.slice(0, -1);
config["body"] = query;
}
let response = await fetch(url, config).catch(error =>
console.log(error)
);
let json = await response.json();
return json;
} catch (error) {
console.log(error);
}
};
也许有人可以指出当图像较大时 PUT 请求有什么问题以及如何解决它。
编辑
是的,因为我怀疑它是大字符串的问题,我检查了错误:
message: 'request entity too large',
expected: 328465,
length: 328465,
limit: 102400,
编辑 2
这是解决问题的完整解决方案
app.use(
bodyParser.urlencoded({
limit: "50mb",
extended: true,
parameterLimit: 50000
})
);
app.use(bodyParser.json({ limit: "50mb" }));
当我使用 nodejs
+ express
和 body-parser
包在服务器端管理我的路由和数据时,我正在构建一个小项目。
在前端,我有一个简单的 react
应用程序,它安装了 tinyMCE
编辑器。
问题是当我将 select 图像插入文档时,编辑器将其设为 base64
blob,当我尝试保存包括该 base64 图像在内的更改时(通过向服务器发出 PUT 请求)节点吐出错误 500。
一开始我认为它是应用程序 json headers 的问题,正如 git 问题主题之一所建议的那样。
所以我切换到
"Content-Type": "application/x-www-form-urlencoded"
但问题依然存在。
然后我尝试使用一些小图像 16x16
(之前是 340x300
)并且它有效...
所以这可能意味着 POST 在数据部分中有太多字符,但我认为限制是 1.9GB
。
这是一些服务器代码示例:
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
router.put("/:id", update);
const update = (req, res, next) => {
documentController.update(req, res, next);
};
const update = async (req, res, next) => {
const { name } = req.body;
const document = await Document.findOne({ name });
...
document
.save()
.then(document => {
...
})
.catch(err => next(err));
};
和前端请求:
request = async (url, method, data) => {
try {
let headers = {
//"Content-Type": "application/json"
"Content-Type": "application/x-www-form-urlencoded"
};
let config = {
headers,
method
};
if (data !== undefined) {
//config["body"] = data;
let query = "";
data = JSON.parse(data);
for (let key in data) {
query +=
encodeURIComponent(key) + "=" + encodeURIComponent(data[key]) + "&";
}
query = query.slice(0, -1);
config["body"] = query;
}
let response = await fetch(url, config).catch(error =>
console.log(error)
);
let json = await response.json();
return json;
} catch (error) {
console.log(error);
}
};
也许有人可以指出当图像较大时 PUT 请求有什么问题以及如何解决它。
编辑
是的,因为我怀疑它是大字符串的问题,我检查了错误:
message: 'request entity too large', expected: 328465, length: 328465, limit: 102400,
编辑 2
这是解决问题的完整解决方案
app.use(
bodyParser.urlencoded({
limit: "50mb",
extended: true,
parameterLimit: 50000
})
);
app.use(bodyParser.json({ limit: "50mb" }));