IIS 10托管IISNode时Express接口接收大数据POST请求报连接重置错误
排查思路与解决方案
- 优先检查Express请求体解析中间件限制
你当前未展示Express的请求体解析配置,默认express.json()(或旧版bodyParser.json())的请求体大小限制仅为100KB,超出阈值会直接拦截请求、无返回,符合你“请求无法到达接口端点”的特征。调整方式为修改中间件配置,按需调大上限:// 示例调整为50MB上限,可根据实际业务需要修改 app.use(express.json({ limit: '50mb' })) - 补充IIS与iisnode的超时、大小限制配置
你当前配置了maxAllowedContentLength,但缺少超时相关配置,2分钟报错刚好匹配IIS默认的请求超时阈值。在Node侧的web.config中补充以下配置:
同时需要调整IIS对应应用程序池的配置:将闲置超时、队列长度、常规超时均调大到大于业务实际耗时的数值。<configuration> <system.web> <!-- 执行超时单位为秒,最大请求大小单位为KB,此处配置为2GB、10分钟超时 --> <httpRuntime executionTimeout="600" maxRequestLength="2097151" /> </system.web> <system.webServer> <!-- 新增iisnode超时配置 --> <iisnode requestTimeout="00:10:00" idleTimeoutOut="3600000" /> <!-- 原有配置保持不变 --> </system.webServer> </configuration> - 补充Node侧异常捕获逻辑
你当前的接口代码未处理searchMultipleProduct的运行异常,若该方法处理大数据时抛出错误、超时未返回,未捕获的Promise异常会导致Node进程崩溃,iisnode会主动重置连接,对应你遇到的报错。修改接口代码补充异常捕获:
同时可在Node启动代码中新增全局异常监听,避免进程意外崩溃:app.post('/searchMultiple', (request, response) => { tableData = request.body; if (tableData.length > 0) { searchMultipleProduct(tableData) .then(results => { response.status(200); response.json(results); }) // 新增异常捕获 .catch(err => { console.error('接口处理错误:', err); response.status(500).json({ error: '服务处理失败' }); }); } else { response.end(); } });process.on('unhandledRejection', err => console.error('未捕获的Promise异常:', err)); process.on('uncaughtException', err => console.error('未捕获的全局异常:', err)); - 分层排查定位问题层级
可以通过分层测试快速定位问题:- 直接在服务器本地用Postman调用Node服务的
localhost:3000/searchMultiple接口,发送超过320条的请求体:如果请求正常返回,说明问题出在IIS代理/ASP.NET前端层;如果同样报错,说明问题在Node服务层。 - 若确认是IIS层问题,可排查服务器是否存在WAF、安全组、杀毒软件拦截大体积POST请求的规则,同时检查TCP连接相关的系统策略是否有限制。
- 直接在服务器本地用Postman调用Node服务的
- 调整ASP.NET前端配置
在前端的web.config中,给httpRuntime节点补充大小和超时配置:<httpRuntime targetFramework="4.7.2" maxRequestLength="2097151" executionTimeout="600" />
内容的提问来源于stack exchange,提问作者rahsinha
相关产品推荐
相关产品推荐

