当我尝试在我的删除(或更新)路由中使用req.params.id时,我收到上述消息。这已经困扰了我一段时间,我确定我在路线/物体的某个地方犯了错误。
从res.render更改应用程序(" / campgrounds / + req.params.id);至 - res.render(" /露营地&#34);解决了这个问题,但没有重新加载相同的页面,就像我希望它能做到的那样。当我从req.params.id访问露营地路线时,我无法理解为什么应用程序返回未定义。
var express= require("express");
var router = express.Router();
var Comment = require("../models/comment");
var Campground = require("../models/campgrounds");
// COMMENTS EDIT ROUTE
router.get("/campgrounds/:id/comments/:comment_id/edit", function(req, res){
Comment.findById(req.params.comment_id, function(err, foundComment){
if(err){
console.log(err)
} else {
res.render("comments/edit", {campground_id: req.params.id, comment: foundComment})
}
})
})
// comment update
//campgrounds/:id/comments/:comment_id
router.put("/:comment_id", function(req, res){
Comment.findByIdAndUpdate(req.params.comment_id, req.body.comment, function(err, updatedComment){
if(err){
console.log(err)
} else {
// KNOWN BUG - /campgrounds/ + req.params.id will return cast to boject failed for value undefined at path _id. having the app redirect to all campgrounds page as a work around
res.redirect("/campgrounds");
}
})
})
// DELETE ROUTER
router.delete("/:comment_id", function(req, res){
Comment.findByIdAndRemove(req.params.comment_id, function(err){
if(err){
res.redirect("back");
} else {
res.redirect("/campgrounds/" + req.params.id);
}
})
})
function isLoggedIn(req, res, next){
if(req.isAuthenticated()){
return next();
} else {
res.redirect("/login");
}
}
module.exports = router;
答案 0 :(得分:1)
我遇到了同样的问题,这是由于路线顺序造成的。我将显示路线移动到索引路线下面,因为它流动得更好"但是这打破了代码,并且因为我认为路线顺序很重要而混淆了。如果您重新排序,请确保从应用程序的角度来理解您的路线
答案 1 :(得分:0)
确保您在评论表单中输入字段名称“id”(或在ajax请求中输入“id”)。
router.put("/:comment_id", function(req, res){
const id = req.params.id;
console.log(id);
Comment.findByIdAndUpdate(req.params.comment_id, req.body.comment, function(err, updatedComment){
if(err){
console.log(err)
} else {
res.redirect("/campgrounds/" + id);
}
})
})
答案 2 :(得分:0)
我认为您的问题是您没有将html中的comment_id发送给控制器尝试打印req.params.comnent_id
然后尝试这个
var express= require("express");
var router = express.Router();
var Comment = require("../models/comment");
var Campground = require("../models/campgrounds");
// COMMENTS EDIT ROUTE
router.get("/campgrounds/:id/comments/:comment_id/edit", function(req, res){
console.log("params.comment_id",params.comment_id);
if(req.params.comment_id){
Comment.findById(req.params.comment_id, function(err, foundComment){
if(err){
console.log(err)
} else {
res.render("comments/edit", {campground_id: req.params.id, comment: foundComment})
}
}else {
res.render("comments/edit", {campground_id: req.params.id, comment: foundComment})
}
})
})
答案 3 :(得分:0)
好的,我最近遇到了同样的问题。我尝试在整个Internet上找到解决方案,但未能获得任何有用的答案。
然后我尝试查看“ CastError”,发现从“ req.params.id”获得的ID前面有一个多余的空格。
例如:我得到的不是5bed4f6276c4920db404eb25,而是5bed4f6276c4920db404eb25。我不知道(为什么)为什么我会获得带有多余空白的ID,但我认为空白一定是问题所在。
所以我用javascript替换功能剥离了空白的ID,如下所示:
var curid = req.params.id;
curid = curid.replace(/\s/g,'');
成功了!
所以不是
Campground.findByIdAndUpdate(req.params.id, req.body.campground, function(err, updatedCamp){..}
现在使用:
Campground.findByIdAndUpdate(curid, req.body.campground, function(err, updatedCamp){..}
因此,您必须全部替换
req.params.id
在您的代码块中使用
curid
你很好!
以下是整个代码块,供您参考:
router.put("/:id", function(req, res){
var curid = req.params.id;
curid = curid.replace(/\s/g,'');
Campground.findByIdAndUpdate(curid, req.body.campground, function(err, updatedCamp){
if(err){
console.log(err);
res.redirect("/campgrounds");
} else{
//redirect somewhere (show page)
res.redirect("/campgrounds/" + curid);
}
});
答案 4 :(得分:0)
此问题的最佳解决方案是通过清除_id的格式来重新格式化_id(在我的情况下,该空格来自模板“ x.ejs”中的表单)
const to_remove = req.body.checkbox;//id from template is wrong
const listname = req.body.check_list_name;
let **to_rem_cured** = to_remove.replace(/\s/g,'');
List.findOneAndUpdate({name:listname},{'$pull':{list:{_id: **to_rem_cured** }}},function(err,doc){
if(!err){
console.log(doc);
res.redirect("/"+listname);
}
else{
console.log(err);
}
});