Node.js服务器遇错误请求时挂起冻结的原因排查
问题分析与解决方案
兄弟,我一眼就揪出你代码里的问题了——所有错误/异常路径都没正确给客户端返回响应,导致HTTP请求一直处于挂起状态,积累多了服务器自然就被堵得冻结了。咱们一条条拆解:
核心问题点
- 缺失
sigs参数时无响应:如果请求没带sigs,你的代码直接啥也不做,客户端会一直等着服务器给结果,对应的HTTP连接也不会释放,多来几个这种请求,服务器的连接池就满了。 JSON.parse未做异常捕获:如果req.body.packedTr不是合法的JSON字符串,JSON.parse会直接抛出异常,整个请求处理逻辑崩溃,同样没给客户端任何反馈,连接直接挂死。catch块未结束响应:就算xmf.pushTransaction调用失败,你只打印了错误日志,没给res发响应也没结束请求,客户端还是在傻等,连接一直占着资源。
修复后的代码
我把所有遗漏的响应处理都补上了,你直接用就行:
app.post('/pushtransaction', function(req, res) { console.log(req.body); console.log(5); // 先处理sigs不存在的情况,直接返回错误响应 if (!req.body.sigs) { return res.status(400).send('Missing required parameter: sigs'); } try { let sigver = xmf.modules.ecc.Signature.from(req.body.sigs).toString(); let lasig = [sigver]; console.log(req.body.packedTr); // 给JSON.parse加try-catch,处理非法JSON的情况 let transi = JSON.parse(req.body.packedTr); let package = { compression: 'none', transaction: transi, signatures: lasig }; console.log(package); // Pushes tx in correct format xmf.pushTransaction(package) .then(result => { console.log(result); res.send(result); // 成功返回结果 }) .catch(err => { console.log(err); res.status(500).send('Transaction push failed: ' + err.message); // 失败返回错误信息 }) .finally(() => { res.end(); // 不管成功失败,最后结束请求(Express的send后会自动end,这里是双重保障) }); } catch (parseErr) { console.log('JSON parse error:', parseErr); res.status(400).send('Invalid packedTr parameter: ' + parseErr.message); // 处理JSON解析错误 } });
关键修复说明
- 新增了
sigs参数不存在的判断,直接返回400错误响应,快速结束无效请求。 - 把涉及
JSON.parse和Signature.from的逻辑包在try-catch里,捕获任何同步异常,返回对应的错误信息。 - 在
pushTransaction的catch块里添加了res.status(500).send(),确保异步错误也能给客户端明确反馈。 - 加了
finally块确保请求最终会被结束(不过Express里调用res.send()后会自动调用res.end(),这里是双重保障)。
以后写Express接口一定要记住:任何代码分支都必须确保给客户端返回响应,不然连接泄漏积累多了,服务器肯定会挂掉。
内容的提问来源于stack exchange,提问作者user9760741
相关产品推荐
相关产品推荐

