Node.js开发Weather API时Postman请求处理完成后挂起如何解决
问题原因
Postman 持续挂起等待的核心原因是 Express 的请求响应流程没有主动终止:
只要客户端发过来的请求,没有通过 res.send()/res.json()/res.end() 这类方法主动返回响应、释放 TCP 连接,Node 服务就会一直保持连接状态直到触发超时阈值,Postman 自然会一直转圈等待。
同时现有代码的异步流程是断裂的:request 库的调用是异步回调实现,代码里用同步赋值的方式拿返回值,永远拿不到实际请求回来的天气数据,就算想给客户端回响应也没有可用的内容。
具体修复步骤
1. 调整 model.js 的异步透传逻辑
原代码里的 getData 是异步执行,不能用同步 return 拿结果,需要通过回调把最终获取的天气数据、错误向外传递:
// model.js const request = require('request'); function getData(city, callback) { const url = "something"; request(url, function (err, response, body) { if (err) { callback(err, null); return; } callback(null, JSON.parse(body)); }); } exports.check = (city, callback) => { city = city.toLowerCase(); getData(city, (err, data) => { if (err) { callback(err, null); return; } callback(null, data); }); };
2. 调整 controller.js 的响应逻辑
controller 层拿到 model 返回的最终结果后,必须主动调用 res 对应的方法结束请求:
// controller.js const UserModel = require('./model'); exports.check = (req, res) => { // 基础入参校验 if (!req.body.city) { return res.status(400).json({ code: 400, message: "请传入city参数" }); } UserModel.check(req.body.city, (err, weatherData) => { // 异常分支返回错误响应 if (err) { return res.status(500).json({ code: 500, message: "天气服务请求失败", error: err.message }); } // 成功分支返回天气数据,执行完这行后连接会主动释放,Postman 就会结束等待 res.status(200).json({ code: 200, data: weatherData }); }); };
3. 路由配置无需调整
原有的路由挂载写法本身没有问题,保持即可:
app.post('/check', UsersController.check);
额外注意事项
- 不要在 controller 中直接接收
UserModel.check的同步返回值,这个值永远是undefined——因为异步请求的执行速度慢于同步代码的执行节奏,同步代码运行完的时候请求还没返回。 - 所有分支的响应逻辑前都要加
return,避免执行完响应逻辑后继续向下运行其他代码,触发Cannot set headers after they are sent to the client的常见报错。 request库目前已停止维护,后续可以替换为支持 Promise 语法的axios等库,减少回调嵌套的代码量。
内容的提问来源于stack exchange,提问作者Juliette
相关产品推荐
相关产品推荐

