MongoDB博客站点更新路由CastError问题求助(ObjectId转换失败)
解决Mongoose CastError: Cast to ObjectId失败的问题
嘿,这个问题我一眼就揪出根源啦!你看错误信息里的stringValue: '" 5eb4e6190ce97a09f7484ed5"'——你的ObjectId前面多了个讨厌的空格!这就是Mongoose没法把它转换成合法ObjectId的核心原因。
问题出在哪?
看你的表单提交代码:
<form class="ui form" action="/blogs/ <%= blog._id %>?_method=PUT " method="POST">
这里的action属性里,/blogs/后面多了一个空格,<%= blog._id %>前面的空格会被直接带到最终生成的URL里,导致后端拿到的req.params.id是带前置空格的字符串,自然通不过Mongoose的ObjectId格式校验。
修复方案
1. 修正表单的action属性
把多余的空格全部去掉,改成:
<form class="ui form" action="/blogs/<%= blog._id %>?_method=PUT" method="POST">
注意/blogs/和<%=之间不要留空格,同时去掉末尾的空格,这样生成的URL里id就干净啦。
2. (可选)路由层增加容错处理
为了避免以后再出现类似的空格问题,你可以在路由里对req.params.id做个trim处理,强制去掉前后空格:
app.put("/blogs/:id", function(req,res){ // 去掉id前后的空格,增加容错性 var cleanId = req.params.id.trim(); var ID = {_id: cleanId}; Blog.updateOne(ID, req.body.blog, function(err , updatedBlog){ if(err){ console.log(err); res.redirect("/blogs"); } else{ res.redirect("/blogs/"+cleanId); } }); });
这样双重保险之后,这个CastError问题就彻底解决啦!
内容的提问来源于stack exchange,提问作者Ritish Gupta
相关产品推荐
相关产品推荐

