Node Express结合MongoDB删除单条记录却清空全表问题求助
问题原因
1. 接口请求方法错误
你把删除操作做成了GET请求,主流浏览器为了提升用户体验,会对页面上的所有GET链接做预加载处理,也就是后台提前请求所有a标签指向的地址来缓存,导致你页面一加载,所有删除接口就被自动调用了,所有数据自然就被清空了。你控制台只打印你点击的那条,是因为预加载的请求日志可能你没注意到,或者页面重定向后之前的日志被冲掉了。
2. Mongoose删除方法参数格式错误
findOneAndDelete方法的第一个参数要求是查询条件对象,你直接传入req.params.id字符串是不符合要求的,正确写法应该是指定匹配_id字段:{_id: req.params.id}。
另外还有一个不规范的写法:你每次收到删除请求都重新调用mongoose.connect连接数据库,数据库连接只需要在项目启动时初始化一次即可,不需要每次请求重复连接。
修复方案
第一步:修改前端删除逻辑为POST请求
把原来的删除a标签替换成表单提交的POST方式,避免触发浏览器预加载:
<!-- index.ejs里的Action列对应修改 --> <td> <a href="/edit/<%= users[i]._id %>">Edit</a> | <form action="/delete/<%= users[i]._id %>" method="POST" style="display:inline;"> <button type="submit" style="background:none;border:none;color:blue;cursor:pointer;padding:0;text-decoration:underline;">Delete</button> </form> </td>
第二步:修正服务端代码
首先把数据库连接移到项目启动逻辑中,再修改删除接口的请求方法和查询参数:
// server.js 启动时就完成数据库连接,不要放在接口逻辑里 mongoose.connect(process.env.URI,{ useNewUrlParser:true, useUnifiedTopology:true }).then(() => console.log('数据库连接成功')) .catch((err) => console.log('数据库连接失败', err)); // 把原来的app.get('/delete/:id')修改为app.post app.post('/delete/:id',(req,res) => { Student.findOneAndDelete({_id: req.params.id}, (err,result) => { if(err){ console.log("Error",err); return res.status(500).send('删除失败'); } console.log(result + " - " + req.params.id); res.redirect('/'); }) });
内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur
相关产品推荐
相关产品推荐

