You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数还有两个致命问题:

  1. deferred.resolve少了括号,Promise永远不会被resolve;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:20:40