POST 大于 64k 的主体无法处理 Express.js

POST with bodies larger than 64k to Express.js failing to process

我正在尝试 post 一些 json 到 express.js 端点。如果 json 的大小小于 64k,那么它就成功了。如果它超过 64k,则请求永远不会被服务器完全接收。只有在 运行 直接在本地表达时才会出现此问题。当 运行 在 heroku 上时,请求继续没有问题。

此问题在 MacOS、Linux(ubuntu 19)和 Windows 中都存在。使用 Chrome、Firefox 或 Safari 时会出现。

当我使用 postman 发出请求时,请求失败。

如果我使用 curl 发出请求,请求成功。

如果我在网络设置中人为限制 chrome 到 "slow 3G" 水平后发出请求,请求成功。

我通过 express 进行了跟踪,发现在尝试解析正文时出现了问题。请求被传递给 body-parser.json(),后者又调用 getRawBody 从请求中获取缓冲区。

getRawBody 正在处理传入的请求流并将其转换为缓冲区。它很好地接收了请求的第一个块,但从未接收到第二个块。最终请求继续解析一个空缓冲区。

bodyparser 的大小限制设置为 100mb,所以这不是问题所在。 getRawBody 从来没有 returns,所以 body-parser 永远不会破解它。

如果我正在记录来自 getRawBody 的事件,我可以看到第一个块进入,但没有触发其他事件。

查看 wireshark 日志,所有数据都通过网络发送。但由于某种原因,express 似乎没有收到所有块。我认为这一定是由于快递如何处理数据包,不知道如何进行。

将来很可能有人会 运行 做同样的事情:这种情况的根本问题是我们用 socket.io 客户端覆盖了 req.socketreq.socket 被节点内部用来传输数据。我们正在覆盖,以便第一个数据包可以通过,但后续数据包不会通过。因此,如果请求处理得足够快,一切都很好。

tl;dr:不要覆盖 req.socket