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
相关产品推荐
相关产品推荐

