我在删除Nodejs应用中的数据时遇到问题。我的ejs模板中有2个按钮,它们向服务器发送完全相同的URL以删除2个模型: 第一个按钮:
<td class="td6"><a href="/myprojects/<%= project._id %>/cost/<%= labour._id %>/remove"><button type="button" class="btn btn-danger">Remove</button></a></td>
第二个按钮:
<td class="td21"><a href="/myprojects/<%= project._id %>/cost/<%= tool._id %>/remove"><button type="button" class="btn btn-danger">Remove</button></a></td>
对于删除数据,我也有完全相同的路径。第一个工作完美,但第二个工作根本不起作用:
第一条路线:
app.get("/myprojects/:id/cost/:labour_id/remove", function(req, res){
Labour.findByIdAndRemove(req.params.labour_id, function(err){
if(err){
console.log(err);
}else{
Project.findById(req.params.id, function(err, foundProject){
if(err){
console.log(err);
}else{
res.redirect("/myprojects/" +req.params.id+ "/cost");
}
});
}
});
});
和第二条路线:
app.get("/myprojects/:id/cost/:tool_id/remove", function(req, res){
Tool.findByIdAndRemove(req.params.tool_id, function(err){
if(err){
console.log(err);
}else{
Project.findById(req.params.id, function(err, foundProject){
if(err){
console.log(err);
}else{
res.redirect("/myprojects/" +req.params.id+ "/cost");
}
});
}
});
});
这里有人能看到任何问题吗?
答案 0 :(得分:3)
您似乎正在尝试使用完全相同的路线模式来执行两个不同的事情(或者,完全相同的事情,但在不同类型的实体上)。我的意思是,对于Express /myprojects/:id/cost/:labour_id/remove
和/myprojects/:id/cost/:tool_id/remove
是完全相同的路由,所以第二个根本不会匹配。解决方案是分别制作两个不同的路线,例如/myprojects/:id/costs/labors/:labour_id/remove
和/myprojects/:id/costs/tools/:tool_id/remove
(注意/labors/
和/tools/
部分。)
另一种方式(以及您可能尝试做的事情)将是创建像/myprojects/:id/costs/:entity(labours|tools)/:tool_id/remove
这样的通用路由,并根据entity
参数的值使用相应的Mongoose模型。但是,我不推荐它,因为它会使代码的可读性降低。有时复制并不是一件坏事。 ;)
此外,作为一般规则,以方法delete
方法(app.delete
)实施删除路由是一种很好的做法。