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

Angular+MongoDB CRUD问题:前端修改后刷新恢复且未同步数据库

问题:Angular + MongoDB CRUD更新失效,仅前端临时变更

点击Enroll按钮后,前端数据的status字段会变为Active,但刷新页面后数据恢复初始值,MongoDB数据库未通过Rest API完成更新。需求是点击按钮后,同时在前端和后端数据库中将status字段更新为Active。


后端Rest API更新代码(Node.js/Express)

router.put('/:id',(req,res)=>{
  if(!ObjectId.isValid(req.params.id))
     return res.status(400).send(`No record with given id:${req.params.id}`)

     let emp = {
     firstName: req.body.firstName,
     lastName: req.body.lastName,
     relationship: req.body.relationship,
     dob:req.body.dob,
     ssn:req.body.ssn,
     memberid:req.body.memberid,
     status:req.body.status,
     };

     Employee.findByIdAndUpdate(req.params.id,{$set:emp},{new :true},(err,doc)=>{
       if(!err){
          res.send(doc);
       }
       else{
          console.log('error in Employee update:' +JSON.stringify(err,undefined,2))
       }
     })
})
module. Exports = router; // 语法错误:此处存在空格

Angular服务文件代码

export class UsersDataService {
  selectedEmployee: Employee;
  statusChanged:any='';
  userSel:any={};
  searchResult:any='';
  userObj:any=[];
  baseURL ='http://localhost:8000/employees/'
  constructor(private http:HttpClient) { 
  }

  users(){
     this.http.get(this.baseURL).subscribe((res) => {
      this.userObj = res ;
     })
  }

  updateUser(user:any){
    console.log(user);
    this.http.put(this.baseURL + user._id,user).subscribe((data) => {
      console.log(data);
    })
  }
}

HTML组件代码

<td><button type="button" class="btn btn-success btn-sm bb" (click)="enrollUser(user)"> Enroll</button> </td>

组件TS文件代码

enroll = false;
userSelected:any={};
unEnroll = false;
unenrolluser ='active';

constructor(public usersData:UsersDataService) {
}


 enrollUser(data:any){
      console.log(data);
      data.status = this.unenrolluser;
      this.userSelected = data;

    
      this.enroll = true;
      this.usersData.updateUser(this.userSelected)

  }

问题排查与修复步骤

1. 修复后端路由导出错误

后端代码最后一行的module. Exports = router;存在语法错误:Node.js的正确导出语法是module.exports,多余的空格会导致路由无法被正确加载,Rest API完全失效。修改为:

module.exports = router;

2. 优化Angular服务的更新逻辑

当前服务的updateUser方法直接在内部订阅请求,组件无法感知请求是否成功。改为返回Observable,由组件控制后续逻辑:

// 服务中修改updateUser方法
updateUser(user:any): Observable<any> {
  return this.http.put(`${this.baseURL}${user._id}`, user);
}

// 同时优化users方法,返回Observable以便组件控制数据刷新
users(): Observable<any> {
  return this.http.get(this.baseURL);
}

3. 组件中完善更新流程

在组件的enrollUser方法中,订阅更新请求结果,确保后端更新成功后再同步前端数据,避免临时变更:

enrollUser(data:any){
  // 创建副本,避免直接修改原对象
  const updatedUser = {...data, status: this.unenrolluser};
  
  this.usersData.updateUser(updatedUser).subscribe({
    next: (res) => {
      // 更新成功后,重新拉取最新用户列表
      this.usersData.users().subscribe(users => {
        this.usersData.userObj = users;
      });
      this.enroll = true;
    },
    error: (err) => {
      console.error('更新失败:', err);
      // 可选:添加错误提示或恢复前端状态
    }
  });
}

4. 可选:简化后端更新逻辑

如果仅需要更新status字段,无需传递所有用户信息,可简化后端代码减少冗余:

router.put('/:id',(req,res)=>{
  if(!ObjectId.isValid(req.params.id))
     return res.status(400).send(`No record with given id:${req.params.id}`);

  // 仅更新status字段
  Employee.findByIdAndUpdate(
    req.params.id,
    {$set: { status: req.body.status }},
    {new :true},
    (err,doc)=>{
      if(!err){
        res.send(doc);
      } else {
        console.error('error in Employee update:', err);
        res.status(500).send('更新失败');
      }
    }
  )
})
module.exports = router;

内容的提问来源于stack exchange,提问作者Arunabh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:25:19