Express 服务器在使用大字符串执行 post / put 请求时发送 500 错误代码

Express server sends 500 error code when doing post / put request with large string

当我使用 nodejs + expressbody-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" }));

看看 multer node middleware. It will handle the upload using streams,而不是在保存之前等待整个文件加载到服务器的内存中。

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

尝试增加您的应用接受的大小限制:

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