首页 > 解决方案 > Express 服务器在使用大字符串进行 post/put 请求时发送 500 错误代码

问题描述

当我使用nodejs+expressbody-parserpackage 在服务器端管理我的路由和数据时,我正在构建小项目。在前端,我有react一个安装了tinyMCE编辑器的简单应用程序。问题是当我选择要插入到文档中的图像时,编辑器将其变成一个base64blob,当我尝试保存包括该 base64 图像在内的更改(通过向服务器发出 PUT 请求)时,节点吐出错误 500。一开始我认为这是一个问题使用 git 问题主题之一中建议的应用程序 json 标头。

所以我切换到

"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 请求有什么问题以及如何解决它。

编辑

是的,因为我怀疑它是大字符串的问题,我检查了错误:

消息:“请求实体太大”,预期:328465,长度:328465,限制:102400,

编辑 2

这是解决问题的完整解决方案

app.use(
  bodyParser.urlencoded({
    limit: "50mb",
    extended: true,
    parameterLimit: 50000
  })
);
app.use(bodyParser.json({ limit: "50mb" }));

标签: javascriptnode.jsexpressputbody-parser

解决方案


看看multer节点中间件。它将使用处理上传,而不是在保存之前等待整个文件加载到服务器的内存中。

编辑(在看到有错误的评论后)

尝试通过以下方式增加您的应用接受的大小限制:

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

推荐阅读