【问题标题】:Express server sends 500 error code when doing post / put request with large stringExpress 服务器在使用大字符串进行 post/put 请求时发送 500 错误代码
【发布时间】:2019-09-12 09:42:56
【问题描述】:

当我使用nodejs + expressbody-parser 包来管理我在服务器端的路由和数据时,我正在构建小项目。 在前端,我有一个简单的react 应用程序,它安装了tinyMCE 编辑器。 问题是当我选择要插入文档的图像时,编辑器将其设为base64 blob,当我尝试保存包括该 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 请求有什么问题以及如何解决它。

编辑

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

message: '请求实体太大', 预期:328465, 长度:328465, 限制:102400,

编辑 2

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

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

【问题讨论】:

  • 当浏览器遇到错误 500 时,节点的控制台会出现什么错误?
  • 是的,你问得很好,我用错误日志更新了我的问题
  • 我已经更新了我的答案。看看这是否能解决您的问题。

标签: javascript node.js express put body-parser


【解决方案1】:

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

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

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

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

【讨论】:

  • 问题是,我没有上传图片,我不能将它们作为文件放在服务器上,它们必须是文档中的 base64 blob,因为稍后会对该文档进行操作。所以这不是图片上传的问题,而是发送字符串到服务器的问题,可能太长了。
  • 我试过了,但是还不够,然后我发现需要额外的参数,所以我在我的问题中添加了完整的解决方案,但你指出了正确的方向,谢谢跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2013-09-13
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 2021-06-05
相关资源
最近更新 更多