【问题标题】:How to do pagination in nodejs+express+mongodbnodejs+express+mongodb如何进行分页
【发布时间】:2017-10-05 13:09:00
【问题描述】:

我正在使用 nodejs+express+mongodb。我正在研究 api。我想在 nodejs+express 中进行分页。 注意:有猫鼬分页选项,但我没有使用猫鼬。我只使用直接 mongodb。

请告诉我如何在 nodejs+express 中进行分页。我得到了这个链接express-paginate

但我无法处理它。我不知道如何在我的 API 中实现它。

这是 JSON 数据。在这个步骤中列出了超过 10 个数组,所以我想为此进行分页。

这是我的 API。在循环的步骤中,我添加了给定(在上面的 github 链接中)分页代码

const get = (req, res, next) => {
applogger.verbose(`retrieving asdsa with id ${req.params.asd}`);
asd.findOneById(req.params.asd)
    .then(function(resp) {
        for (var i = 0; i < resp.steps.length; i++) {
            if (resp.asd[i].image == null) {
                resp.asd[i].image = imgurl;
            }

            asd.paginate({}, { page: req.query.page, limit: req.query.limit }, function(err, users) {

                if (err) return next(err);

                res.format({
                    json: function() {
                        res.json('users', {
                            users: users.docs,
                            pageCount: users.pages,
                            itemCount: users.limit,
                            pages: paginate.getArrayPages(req)(3, users.pages, req.query.page)
                        });
                    },
                    json: function() {
                        // inspired by Stripe's API response for list objects
                        res.json({
                            object: 'list',
                            has_more: paginate.hasNextPages(req)(users.pages),
                            data: users.docs
                        });
                    }
                });
            });
        }

        if (resp.asd == null) {
            resp.asd = imgurl;
        }
        res.json(resp);
    }, function(err) {
        res.send(err);
    });
};

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    使用您的 mongo 聚合/查找等...并应用跳过和限制运算符。

    如果你想按页显示X结果,如果你是页码N(从0开始)

    MyCollection.find([
        ...
    ])
    .skip(X * N)
    .limit(X)
    .exec(function(err, result){
    

    ///

     Tourtle.find({})
     .skip(req.skip)
     .limit(req.query.limit)
     .exec(function(err, users) {
        if(err) .... else .....
      });
    

    【讨论】:

    • 嗨,你能多解释一下吗?你能告诉我如何在我的代码中实现它。我是否应该删除添加的快速分页代码(在我添加的 for 循环之后)
    • 查看编辑。不,你可以保留它。只需将 Tourle.paginate 替换为 find
    • 很抱歉。我还是做不到。您可以使用我的代码并进行修改吗?请上传?
    • 替换这个“ Tourtle.paginate({}, { page: req.query.page, limit: req.query.limit }, function(err, users) { if (err) return next( err);" 使用上面的代码。
    • 但是您的代码完全错误。您在 for 中执行异步操作,然后调用 res.json。您需要将 for 替换为 async for like (async.eachOf caolan.github.io/async/docs.html)
    【解决方案2】:

    在您的客户端中,您需要进行如下分页:

    <ul class="pagination">
      <li><a href="/yourRoute/1">1</a></li>
      <li><a href="/yourRoute/2">2</a></li>
    </ul>
    

    你的后端就像:

    const getTourtle = (req, res, next) => {
        var page = req.params.id;
        var minPage = 10 * (page - 1);
        var maxPage = minPage + 10;
        db.collection.find({
             //do your query
        }).min({_id:min_page}).max({_id:max_page});
    
        res.json(resp); // send response to client
    }
    

    【讨论】:

    • 嗨,我没有使用任何视图页面。我没有使用客户端。现在我正在研究 API。我想在 API 中显示它,就像 json 数据在浏览器中的显示方式一样,它应该显示分页。请看上面的屏幕截图。
    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 2018-01-04
    • 2018-06-26
    • 2020-09-11
    • 2011-01-04
    • 2021-08-16
    • 2018-05-27
    • 2011-10-30
    相关资源
    最近更新 更多