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.socket
。 req.socket
被节点内部用来传输数据。我们正在覆盖,以便第一个数据包可以通过,但后续数据包不会通过。因此,如果请求处理得足够快,一切都很好。
tl;dr:不要覆盖 req.socket
。
我正在尝试 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.socket
。 req.socket
被节点内部用来传输数据。我们正在覆盖,以便第一个数据包可以通过,但后续数据包不会通过。因此,如果请求处理得足够快,一切都很好。
tl;dr:不要覆盖 req.socket
。