MEAN栈中HTTP PUT请求失效问题求助
排查PUT请求无效的问题
先揪出最核心的问题:Angular的HTTP请求是「冷Observable」,必须调用subscribe()才会实际发送请求!
你在组件里只调用了this.usersService.updateUser(this.currentUser._id),但完全没有对返回的Observable进行订阅操作——这就相当于你只给快递填了地址,却没把快递交给快递员,请求根本没发出去,自然服务端的console.log('hello there')一点反应都没有。
第一步:修复客户端的请求触发问题
修改组件代码,给updateUser添加订阅,才能真正触发PUT请求:
constructor(private usersService: UsersService) { this.currentUser = JSON.parse(localStorage.getItem('currentUser')); this.currentUserName = this.currentUser.name; // 必须添加subscribe,请求才会被发送 this.usersService.updateUser(this.currentUser._id) .subscribe({ next: () => console.log('用户状态更新成功'), error: (err) => console.error('更新失败:', err) }); }
第二步:修正服务端路由的参数错误
就算请求发出去了,你的服务端路由还有个小bug:路由定义的是/update/:id,但处理函数里用了req.params._id,应该改成req.params.id,否则会拿不到用户ID:
router.put('/update/:id', function(req, res) { console.log('hello there'); let user = req.body; // 把req.params._id改成req.params.id userService.update(req.params.id, req.body) .then(function() { res.sendStatus(200); }) .catch(function(err) { // 注意:sendStatus和send不能同时用,改成status+send res.status(500).send(err.name + ': ' + err.message); }); });
第三步:修复服务端Service的Promise逻辑错误
你的update函数还有两个致命问题:
deferred.resolve少了括号,Promise永远不会被resolve;return deferred.promise放在了内部函数updateLoggedIn里,外层函数根本没返回Promise,导致服务端的then/catch完全无效。
修正后的代码:
function update(_id, set) { var deferred = Q.defer(); db.users.findById(_id, function(err, usr) { if(err) { deferred.reject(err.name + ': ' + err.message); return; // 提前终止,避免后续逻辑执行 } if(usr) { updateLoggedIn(); } else { console.log('用户不存在'); deferred.reject('用户不存在'); // 主动reject,避免Promise挂起 } }); function updateLoggedIn() { db.users.update({ _id: _id}, { $set: set }, function(err, doc) { if(err) { deferred.reject(err.name + ': ' + err.message); } else { // 加上括号,触发Promise resolve deferred.resolve(); } }); } // 把return移到外层,让update函数返回Promise return deferred.promise; }
额外排查小技巧
可以打开浏览器开发者工具的「Network」标签,查看是否有PUT请求发送——这是快速判断请求是否发出的最直观方法。
内容的提问来源于stack exchange,提问作者FavoriteFave
相关产品推荐
相关产品推荐

