Mongoose - 转换为ObjectId失败

时间:2017-07-30 10:11:44

标签: javascript node.js mongodb express mongoose

我正在开发一个小博客应用程序,我被困在这个错误 -

{
  "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: "https://images.pexels.com/photos/457443/pexels-photo-457443.jpeg?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,但它在开头有一个像这样的空间

  • &#39; 597c4ce202ca9c353fc80e8a&#39;并且在url%20中每次在id之前加起来,就像这样 - &gt; http://localhost:5000/blogs/%20597c4ce202ca9c353fc80e8a如果我从网址中删除了%20,则会显示请求的页面。 我被困在这里很长一段时间,我没有找到解决方案。请帮忙

2 个答案:

答案 0 :(得分:0)

感觉ObjectId无效。你正在路过。 请查看:

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

答案 1 :(得分:0)

您需要在模型中指定“ id”的类型为ObjectId,如以下示例所示:

const Schema = new mongoose.Schema({
    _id: ObjectID,
    ....
})

这应该可以解决问题!