[CastError:对于值而言,施放到ObjectId失败"未定义"在路径" _id"

时间:2017-10-06 03:40:47

标签: javascript node.js mongodb mongoose

当我尝试在我的删除(或更新)路由中使用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;

5 个答案:

答案 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);

  }
});