Javascript [CastError:path“U id”处的值“undefined”转换为ObjectId失败;

Javascript [CastError:path“U id”处的值“undefined”转换为ObjectId失败;,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,当试图在我的删除(或更新)路由中使用req.params.id时,我收到了上面的消息。这让我困惑了一段时间,我确信我在路由/对象的某个地方犯了错误 将应用程序从res.render(“/campgrounds/+req.params.id”);更改为- res.render(“/campgrounds”);解决了这个问题,但没有像我希望的那样重新加载相同的页面。我无法理解为什么应用程序在从req.params.id访问营地路线时返回未定义 var express= require("expres

当试图在我的删除(或更新)路由中使用req.params.id时,我收到了上面的消息。这让我困惑了一段时间,我确信我在路由/对象的某个地方犯了错误

将应用程序从res.render(“/campgrounds/+req.params.id”);更改为- res.render(“/campgrounds”);解决了这个问题,但没有像我希望的那样重新加载相同的页面。我无法理解为什么应用程序在从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;

确保在注释表单中输入了字段名“id”(或者在ajax请求中输入了“id”)

router.put(“/:comment\u id”),函数(req,res){
const id=req.params.id;
console.log(id);
Comment.findByIdAndUpdate(req.params.Comment\u id,req.body.Comment,函数(err,updatedComment){
如果(错误){
console.log(错误)
}否则{
res.redirect(“/营地/”+id);
}
})

})
确保在注释表单中输入字段名“id”(或在ajax请求中输入“id”)

router.put(“/:comment\u id”),函数(req,res){
const id=req.params.id;
console.log(id);
Comment.findByIdAndUpdate(req.params.Comment\u id,req.body.Comment,函数(err,updatedComment){
如果(错误){
console.log(错误)
}否则{
res.redirect(“/营地/”+id);
}
})

})
我认为您的问题在于您没有将注释id从html发送到控制器。请尝试打印
req.params.comnent\u 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})
                    }

                })
            })

我认为您的问题在于您没有将注释id从html发送到控制器。请尝试打印
req.params.comnent\u 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})
                    }

                })
            })

我也遇到了同样的问题,这是由于路线顺序。我将表演路线移到了索引路线下方,因为“它流动得更好”,但这破坏了代码,并混淆了它,因为我认为路由顺序很重要。如果您对它们重新排序,请确保您的路由从应用程序的角度来看是有意义的。

我遇到了相同的问题,这是由于路由顺序。我将显示路由移到索引路由下方,因为“它流得更好”,但这破坏了代码,并混淆了它,因为我认为路由顺序很重要。如果您对它们重新排序,请确保您的路由从应用程序的角度来看是合理的。

好的,伙计们,我最近遇到了同样的问题。我尝试在互联网上寻找解决方案,但没有得到任何有用的答案

然后我努力查看“CastError”,发现我从'req.params.ID'获得的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);        
    }
});

好了,伙计们,我最近遇到了同样的问题。我尝试在互联网上寻找解决方案,但没有得到任何有用的答案

然后我努力查看“CastError”,发现我从'req.params.ID'获得的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);        
    }
});

<> P>这个问题的最佳解决方案是通过清除它添加的空白空间来重新格式化YID(在我的例子中,来自我的模板中的一个表单“X.EJS”)


<> P>这个问题的最佳解决方案是通过清除它添加的空白空间来重新格式化YID(在我的例子中,来自我的模板中的一个表单“X.EJS”)


你能告诉我请求的url吗?你是如何从server@Andyapp.listen(process.env.PORT,process.env.IP,function(){console.log(“应用程序正在运行”);})你能给我请求的url吗?你是如何从server@Andyapp.listen(process.env.PORT、process.env.IP、function(){console.log(“应用程序正在运行”);})我的输入字段设置是这样的:很抱歉设置了格式。我花了很长时间想弄清楚如何在堆栈中设置注释的格式。你是不是建议我在输入中添加name=“id”?@ứcêMinhi认为您应该在注释中存储campground_id。然后您可以重定向到“campgrounds/”+updatedComment.campground_idI将我的输入字段设置为:很抱歉设置了格式。我花了很长时间试图弄清楚如何在堆栈中设置注释的格式。你是否建议我在输入中添加name=“id”?@ứcêMinhi认为您应该在注释中存储campground_id。然后您可以重定向到“campgrounds/”+updatedComment.campground\u idSo这是我设置的edit.ejs文件中的html:
我已将您的代码添加到路由并更新了注释。\u id仅用于注释\u id。我想这就是您将html传递给控制器的意思。当我这样做时,我会收到一个引用错误,说明注释\u id未定义。更改此
控制台。log(“params.comment_id”,params.comment_id);
console.log(“params.com