【问题标题】:Mongoose pagination from server side服务器端的猫鼬分页
【发布时间】:2017-10-11 01:28:04
【问题描述】:

我正在尝试将服务器端分页添加到 NodeJS、Express 和 MongoDB API。 API 使用猫鼬来处理数据库。我不知道如何自定义控制器的响应。

型号:

const mongoose = require('mongoose');
const Schema =  mongoose.Schema;

const clientSchema = Schema({
  code: {
    type: String,
    required: [true,'Code no puede estar vacio']
  },
  name: {
    type: String,
    required: [true,'Name no puede estar vacio']
  }
},{
  timestamps: true
});

const Client = module.exports = mongoose.model('clients',clientSchema);

获取所有客户端的控制器:

const mongoose = require("mongoose");
const Client = require('../models/client');
const clientController = {};


clientController.index = (limit, callback) => {
  Client.find(callback).limit(limit);
};

module.exports = clientController;

获取客户的路线:

  app.get('/api/clients', (req, res) => {
      Client.index(limit,(err, client) => {

        if (err) {
          res.status(500).json({
            msg: "Error en aplicacion",
            err
          });
        }
        res.status(200).json(client);
      });
  });

如何将控制器中的结果自定义为如下内容:

[
{
"totalRecords":"99999999999",
"offset":"888888",
"page":"4",
"nextPage":"5"
"result":{...}
}
]

我已经有了一个计算分页的函数,但是我不知道如何在控制器的结果中添加关于分页的信息。

在我在路由中添加分页数据之前,但我想在控制器中处理分页逻辑。

还是更好地处理路由中的分页?

提前致谢

【问题讨论】:

标签: node.js mongodb express mongoose


【解决方案1】:

您可以在 mongoose 模型中创建一个名为 paginate 的方法:

在声明猫鼬模型之前添加:

clientSchema.methods.paginate = function(pageNo, callback){

    var limit = 10;
    var skip = pageNo * (limit - 1);
    var totalCount;
    
    //count documents
    this.count({}, function(err, count)){
        if(err){
            totalCount = 0;
        }
        else{
            totalCount = count;
        }
    }
    if(totalCount == 0){
        return callback('No Document in Database..', null);
    }
    //get paginated documents
    this.find().skip(skip).limit(limit).exec(function(err, docs){

        if(err){
            return callback('Error Occured', null);
        }
        else if(!docs){
            return callback('Docs Not Found', null);
        }
        else{
            var result = {
                "totalRecords" : totalCount,
                "page": pageNo,
                "nextPage": pageNo + 1,
                "result": docs
            };
            return callback(null, result);
        }

    });

});

const Client = module.exports = mongoose.model('clients',clientSchema);

然后在控制器更改:

app.get('/api/clients', (req, res) => {
    //You could put page number in request query ro request params
    Client.paginate(req.body.pageNo, function(err, response) {
        if (err) {
            return res.status(500).json({
                message : "Error en aplicacion",
                error : err
            });
        }
        return res.status(200).json(response);
    });
});

【讨论】:

  • 如果您有多种分页方法,您将如何构建它?
  • 小幅更正,跳过应该是:var skip = limit * (pageNo - 1);例子,在pageSize为100的85页,skip = 100 * (85 - 1) = 8400 // Skip the first 8400 elements
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 2016-05-04
  • 2018-06-15
  • 2021-03-17
  • 2018-08-22
  • 2015-09-07
  • 1970-01-01
相关资源
最近更新 更多