javascript - Expressjs 使用对象标题作为动态 url

标签 javascript node.js mongodb express

我正在尝试弄清楚如何通过标题而不是 ID 来路由我的 GET 单个对象路由参数。我知道 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>

点击“阅读更多”的结果 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 期望第一个参数为 mongoose.Types.ObjectId,但 req.params.blogpost_id 是一个 字符串

如果您想按标题获取博文,请使用

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' });
         });
     });

关于javascript - Expressjs 使用对象标题作为动态 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26186105/

相关文章:

node.js - 如何在没有模式的情况下创建 Mongoose Provider。嵌套

c# - 使用具有鉴别器和多态性的 C# MongoDB v2 驱动程序

javascript - "Javascript - The Definitive Guide"- 未捕获的类型错误 : trace(. ..) 不是函数

javascript - Observable 模式如何在 Javascript 中工作?

javascript - 找不到模块 'mongodb/node_modules/bson'

mysql - 如何通过 ssh(在 Mac 上)使用 Node 的 mysql 库?谷歌搜索后,我仍然得到 "channel 3: open failed: connect failed: Connection refused"

node.js - Expressjs删除静态文件夹

node.js - 我应该依赖 package.json 还是对我的 Node 模块进行版本控制?

javascript - 如何在 Loopback 中获取嵌套的主从或主-从-从查询

javascript - 在数组内部映射数组