将大于64k的正文发布到Express.js无法处理

将大于64k的正文发布到Express.js无法处理,express,http,fetch,body-parser,Express,Http,Fetch,Body Parser,我正在尝试将一些json发布到express.js端点。如果json的大小小于64k,那么它就成功了。如果超过64k,则服务器永远不会完全接收到请求。只有在本地直接运行express时才会出现此问题。在heroku上运行时,请求不会出现问题 这个问题在MacOS、Linux(Ubuntu19)和Windows中都可以看到。它在使用Chrome、Firefox或Safari时出现 当我使用邮递员发出请求时,请求失败 如果我使用curl发出请求,则请求成功 如果我在网络设置中人为地将chrome限制

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

这个问题在MacOS、Linux(Ubuntu19)和Windows中都可以看到。它在使用Chrome、Firefox或Safari时出现

当我使用
邮递员
发出请求时,请求失败

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

如果我在网络设置中人为地将chrome限制到“慢速3G”级别后发出请求,则请求成功

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

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

bodyparser上的大小限制设置为
100mb
,因此这不是问题所在
getRawBody
永远不会返回,所以body解析器永远不会对其进行破解

如果我从
getRawBody
记录事件,我可以看到第一个块进入,但不会触发其他事件


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

将来可能会有人遇到同样的情况:本例的根本问题是我们用
socket.io
客户端覆盖了
req.socket
<代码>请求套接字由节点内部用于传输数据。我们正在覆盖,以便第一个数据包能够通过,而不是后续的数据包。因此,如果请求得到足够快的处理,一切都会很好

tl;dr:不要覆盖请求套接字