Expressjs使用对象标题作为dynamicurl

我想弄清楚如何路由我的GET单个对象路由参数的标题,而不是ID。 我知道body-parser允许请求,但不知道如何修改我当前的路由设置,以允许发生这种情况。

我的想法是将所有blogpost_id更改为blogpost_title,但是我遇到了这个错误。

 { "message":"Cast to ObjectId failed for value \"Data Cost Upload\" at path \"_id\"", "name":"CastError", "type":"ObjectId", "value":"Data Cost Upload", "path":"_id" } 

routes.js:

 //Route for individual blogs router.route('/blog/:blogpost_id') // START GET method blog by ID .get(function(req, res) { Blogpost.findById(req.params.blogpost_id, function(err, blogpost) { if (err) res.send(err); //res.json(blogpost); res.render('pages/blogpost', { blogpost: blogpost }); }); }) // END GET method blog by ID // START PUT method .put(function(req, res) { Blogpost.findById(req.params.blogpost_id, function(err, blogpost) { if (err) res.send(err); blogpost.title = req.body.title; // update the blog title blogpost.author = req.body.author; // update the author name blogpost.tagline = req.body.tagline; // update the tagline blogpost.content = req.body.content; // update the blog content blogpost.category = req.body.category; // update the category blogpost.tags = req.body.tags; //update the tags blogpost.save(function(err) { if (err) res.send(err); res.json({ message: 'Blog updated.' }); }); }); }) // END PUT method // START DELETE method .delete(function(req, res) { Blogpost.remove({ _id: req.params.blogpost_id }, function(err, bear) { if (err) res.send(err); res.json({ message: 'Successfully deleted' }); }); }); 

我如何链接到每个单独的对象:

 <div class="blog-content"> <% blogpost.forEach(function(blogpost) { %> <tr> <td><h2><a href="#" class="blog-title"><%= blogpost.title %></a></h2></td> <td><h3><%= blogpost.date %></h3></td> <td><h3 class="blog-category"><%= blogpost.category %></h3></td> <td><h3 class="blog-tagline"><i><%= blogpost.tagline %></i></h3></td> <td><p><%=: blogpost.content | truncate:800 | append:'...' %></p></td> <td><a href="/blog/<%= blogpost.title %>" class="blog-read-more">Read More</a></td> </tr> <% }); %> </div> 

点击“Read More”的结果URL: http://localhost:8080/blog/Data%20Cost%20Upload

当你得到http://localhost:8080/blog/Data%20Cost%20Upload

使用req.params.blogpost_id = "Data Cost Upload"调用route.get处理程序。

Blogs.findById期望第一个参数是req.params.blogpost_id ,但是req.params.blogpost_id是一个string

如果你想获得标题的博客post,请使用

 function getSearchCriteria(params) { return { title: params.blogpost_title }; } function getBlogpostUpdate(body) { return { title: body.title, author: body.author, tagline: body.tagline, content: body.content, category: body.category, tags: body.tags }; } var blogpostsRoute = router.route('/blog/:blogpost_title'); // to manipulate your route params, use router.param router.param('blogpost_title', function (req, res, next, blogpost_title) { req.params.blogpost_title = blogpost_title.toLowerCase(); next(); }); blogpostsRoute .get(function (req, res) { var searchCriteria = getSearchCriteria(req.params); Blogpost.findOne(searchCriteria, function (err, blogpost) { if (err) res.send(err); res.render('pages/blogpost', { blogpost: blogpost }) }) }) .put(function (req, res) { var searchCriteria = getSearchCriteria(req.params); var updated = getBlogpostUpdate(req.body) Blogpost.findOneAndUpdate(searchCriteria, updated, function (err, updated) { if (err) res.send(err); res.json({ message: 'Blog updated.' }); }); }) .delete(function (req, res) { var searchCriteria = getSearchCriteria(req.params); Blogpost.findOneAndRemove(searchCriteria, function (err, removed) { if (err) res.send(err); res.json({ message: 'Successfully deleted' }); }); });