对于Mongo / Mongoose分页的HTML感到困惑

时间:2014-03-18 20:41:12

标签: forms express pagination mongoose

我目前有一个包含大约4,000个文档的集合。我希望能够对结果进行分页,以便用户一次只能查看100个结果。

我非常了解在提交搜索时在服务器端要做什么:

app.post('/browse/:page', function(req, res) {
    var page = parseInt(req.params.page);
    data = {};
    data.page = page;
    data.nextpage = page + 1;
    data.prevpage = page - 1;

    var filterOptions = _.transform(req.body, function(result, value, key) {
        result[key] = new RegExp(value.replace(/[^A-Za-z 0-9!'-]/g,''), "i");
    });

    Model.find(filterOptions).sort('brand').skip((page-1)*100).limit(100).exec(function(err, results) {
        //do stuff here with results
        res.render('browse.ejs', data);
    })
})

});

现在,在我的视图页面上,这就是我所拥有的以及我认为我在做错的事情:

//header here

<div class="wrapper row2">
    <div id="container" class="clear">
    <section>
        <div id="browse-wrap">
            <div id="browse-left_col">
                <h3>Browse by:</h3><br>
                <form action="browse/1" method="post">
                    //form inputs and such here
                    <input type="submit" class="button" value="Browse">
                </form>
            </div>
            <div id="browse-right_col">
                //table of results here
                <p style="text-align:right;"><a href="#" onclick="document.forms[0].attr('action', 'browse/<%=nextpage%>').submit();return false;">Next 100 &#8594;</a></p>
            </div>
        </div>
    </section>
    </div>
</div>

//footer here

感谢您的帮助!我真的很擅长并欣赏它。

1 个答案:

答案 0 :(得分:0)

有一些我建议的事情:

  1. 使用app.get()代替app.post()。您正在从服务器检索信息,app.get()方法表示HTTP GET,而HTTP GET又代表检索。您知道的app.post()方法代表一个HTTP POST,它应该用于向服务器添加信息。
  2. 使用app.get()后,您可以将客户端上的页面表示为/ browse /:page
  3. 的简单链接
  4. 注意页面= 0,页面=最后的边缘情况。当没有上一页时,您可能不希望显示前一个链接。
  5. 当您跳过大量文档时,使用skip()会降低性能。请记住一些事情。
  6. 服务器:

    app.get('/browse/:page', function(req, res) {
            ...
            Model.find().sort('brand').skip((page-1)*100).limit(100).exec(function(err, results) {
               res.render('browse.ejs', {data:data, results:results});
            });
    })
    

    客户端(在您的示例中使用ejs):

    // list data
    <ul>
    <% for(var i=0; i<results.length; i++) {%>
       <li><%= results[i]._id %></li>
    <% } %>
    </ul>
    // show prev/next page links
    <a href="/browse/<%= data.prevPage%>">previous</a>
    <a href="/browse/<%= data.nextPage%>">next</a>
    

    希望有所帮助。