【问题标题】:Paginate blog with AngularJS Mongoose Express使用 AngularJS Mongoose Express 为博客分页
【发布时间】:2014-09-27 22:13:03
【问题描述】:

我想用 AngularJS / Bootstrap 客户端和 Mongoose / Express 服务器端对我的博客进行分页。实际上,我调用了我的 rest API,它返回了我在我的数据库中获得的每一篇博文:

服务器端 lib/controllers/blogs.js

/**
 * List of Blogs
 */
exports.all = function(req, res) {
  Blog.find().sort('-created').populate('creator', 'username').exec(function(err, blogs) {
    if (err) {
      res.json(500, err);
    } else {
      res.json(blogs);
    }
  });
};

我只想获取实际页面上的内容,但我真的不知道该怎么做,因为我正在调用 GET /api/blogs。

服务器端 lib/config/routes.js

  var blogs = require('../controllers/blogs');
  app.get('/api/blogs', auth.ensureAuthenticated, blogs.all);

也许有人可以帮我做这件事?我对 Node.js 完全陌生。

【问题讨论】:

    标签: node.js angularjs express mongoose


    【解决方案1】:

    您需要做的是对数据进行分页,这意味着您一次只需要从数据库返回前 X 项(即博客文章)。像这样的:

    Blog.find().sort('-created').skip(10).limit(10).populate('creator','username').exec(function(err, blogs) {
        if (err) {
          res.json(500, err);
        } else {
          res.json(blogs);
        }
    });
    

    这将返回从 #11 到 #20 的帖子。

    【讨论】:

    • 所以如果我从客户端发送变量而不是 10,它应该可以工作?
    • 是的,应该。但是,Forad Nosrati Habibi 对您的问题的回答更有效率。
    【解决方案2】:

    如果您的帖子不是很多,您可以在查询中简单地使用.skip().limit()

    /**
     * List of Blogs
     */
    exports.all = function(req, res) {
      Blog.find().sort('-created').skip(req.body.skip).limit(req.body.limit).populate('creator', 'username').exec(function(err, blogs) {
        if (err) {
          res.json(500, err);
        } else {
          res.json(blogs);
        }
      });
    };
    

    当您的集合增长时,上述代码的性能并不是那么好。 .skip() 计算您正在跳过的所有文档。 相反,您可以使用范围查询,例如:

    /**
     * List of Blogs
     */
    exports.all = function(req, res) {
      Blog.find({_id: {$gt: req.body.lastId}).sort('-created').limit(req.body.limit).populate('creator', 'username').exec(function(err, blogs) {
        if (err) {
          res.json(500, err);
        } else {
          res.json(blogs);
        }
      });
    };
    

    最后一个代码在性能上更好(即使您有数千个帖子)。但是你只有下一页和上一页,你不能直接跳到第n页。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 2013-03-03
      • 2020-09-01
      • 2015-12-19
      相关资源
      最近更新 更多