【问题标题】:ExpressJS sorting schema object in route fileExpressJS 对路由文件中的模式对象进行排序
【发布时间】:2014-11-20 13:12:52
【问题描述】:

我希望将我的数据库信息按最近日期排序为第一个对象,然后按降序排列较旧的对象。目前我的数据顺序相反,我不确定应该在哪里调用 sort 方法,因为我没有使用 .find 方法。我试过了

`.get(function(req, res, next) {

Blogpost.paginate({}, req.query.page, req.query.limit, {sort: ['dateString', -1]}, function(err, pageCount, blogpost, itemCount) {`

但我收到了TypeError: object is not a function

这是我的模型:

blogModel.js

var mongoose    = require('mongoose');
var mongoosePaginate = require('mongoose-paginate');
var Schema      = mongoose.Schema;



var BlogPostSchema  = new Schema({
        title: String,
        blogUrl: String,
        author: String,
        tagline: String,
        category: String,
        content: String,
        tags: { type: String, lowercase: true },
        date: { type: Date, default: Date.now() }
});

BlogPostSchema.post('init', function (post) {
    var date = new Date(post.date || Date.now() );
    post.dateString = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear();

});

BlogPostSchema.plugin( mongoosePaginate );

var Blogpost = mongoose.model("Blogpost", BlogPostSchema);



module.exports = mongoose.model('Blogpost', BlogPostSchema);

routes.js

var express = require('express');

var router = express.Router();
var blogDB = require('../config/blogDB.js');
var Blogpost = require('./models/blogModel.js');
var paginate = require('express-paginate');

//index 
router.use(paginate.middleware(10, 50));




    router.route('/') 


        // START GET method
        .get(function(req, res, next) {

            Blogpost.paginate({}, req.query.page, req.query.limit, {sort: ['dateString', -1]}, function(err, pageCount, blogpost, itemCount) {




                if (err) return next(err)

                        if (err)
                            res.send(err);




                        res.format({
                            html: function() {
                                res.render('pages/index', {
                                    blogpost: blogpost,
                                    pageCount: pageCount,
                                    itemCount: itemCount
                                })
                            },
                            json: function() {

                                res.json({
                                    object: 'blogpost',
                                    has_more: paginate.hasNextPages(req)(pageCount),
                                    data: blogpost
                                })
                            }
                        }); // END res.format(html, json)
            }); // END Blogpost.paginate
        }); // END GET method

router.route('/admin/posts/create')

    // START POST method
        .post(function(req, res) {

            console.log("New instance");

            var blogpost = new Blogpost(); // create a new instance of a Blogpost model

            blogpost.title = req.body.title; // set the blog title
            blogpost.blogUrl = blogpost.title.toLowerCase().replace(/\s+/g,"-");
            blogpost.author = req.body.author; // set the author name
            blogpost.tagline = req.body.tagline; // set the tagline
            blogpost.content = req.body.content; // set the blog content
            blogpost.category = req.body.category; // set the category
            blogpost.tags = req.body.tags; // set the tags
                //Save Blog Post
                blogpost.save(function(err) {
                    if (err)
                        res.send(err);

                    res.redirect(303, '/'); //NEEDS TO BE CHANGED
                });

        }) // END POST method

index.ejs:

<div class="blog-content">
                <% blogpost.forEach(function(blogpost) { %>
                    <tr>
                        <td><h2><a href="/blog/<%= blogpost.blogUrl %>" class="blog-title"><%= blogpost.title %></a></h2></td>
                        <td><h3><%= blogpost.dateString %></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.blogUrl %>" class="blog-read-more">Read More</a></td>
                    </tr>
                    <% }); %>
            </div>

【问题讨论】:

    标签: javascript node.js sorting express mongoose


    【解决方案1】:

    我以前没有使用过分页插件,但看起来分页插件做了一个非常非标准的事情,即在回调之后添加options 参数。 :(

    看起来sort 属性也有问题。

    TypeError: object is not a function 错误正在发生,因为分页代码试图将您的选项哈希作为函数调用。 https://github.com/edwardhotchkiss/mongoose-paginate/blob/master/lib/mongoose-paginate.js#L54

    应该是这样的:

    Blogpost.paginate({}, req.query.page, req.query.limit, 
        function(err, pageCount, blogpost, itemCount) {
     ...
    }, {sort: {'date': -1 } );
    

    或者这个,因为我认为 mongoose 使用非标准的“sortBy”而不是“sort”。

    Blogpost.paginate({}, req.query.page, req.query.limit, 
         function(err, pageCount, blogpost, itemCount) {
     ...
    }, {sortBy: {'date': -1 } );
    

    您实际上并不想按“dateString”排序,因为它实际上并不在数据库中。按“日期”排序并使用 dateString 进行渲染。此外,将字段称为“日期”可能不是最佳选择,因为它在很多地方都用作关键字。我将其称为 createdDate 或类似的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2020-03-10
      • 2018-08-18
      • 1970-01-01
      • 2013-12-05
      相关资源
      最近更新 更多