【问题标题】:Nodejs Pagination and SearchNodejs 分页和搜索
【发布时间】:2021-12-29 23:09:47
【问题描述】:

您好,我正在使用以下代码在服务器端实现分页和搜索。它对我有用,但是有一个小错误。

例如:
第 1 页:用户 1、用户 2、用户 3
第 2 页:用户 4、用户 5、用户 6

整个数据库包含 6 个用户,但是当我尝试按 user5 进行过滤时,如果我在第 1 页上,它将无法搜索到 user5,只有当我转到第 2 页时,才会出现 user5。我想先做一个过滤器,然后在过滤器的基础上进行切片,但遇到了困难。

感谢帮助,谢谢

router.route('/').get(async (req, res) => {
  try {
    let query = User.find();

    const filter = req.query;
    const page = parseInt(req.query.page) || 1;
    const pageSize = parseInt(req.query.limit) || 10;
    const skip = (page - 1) * pageSize;
    const total = await User.countDocuments();
    const pages = Math.ceil(total / pageSize);

    if (page > pages) {
      return res.status(404).json({
        status: "fail",
        message: "No page found",
      });
    }

    result = await query.skip(skip).limit(pageSize);
    const filtered = result.filter(target => {
      if (filter.filter === "") {
        return target;
      }
      else if (target.name.toLowerCase().includes(filter.filter)){
        return target;
      }
      else if (target.email.toLowerCase().includes(filter.filter)){
        return target;
      }
    })
    
    res.json({
      status: "success",
      filter,
      count: result.length,
      page,
      pages,
      data: filtered
    });
  } catch (error) {
    console.log(error);
    res.status(400).json({
      status: "error",
      message: "Server Error",
    });
  }
});

it should return one user here

it only returns that user in page 2

我希望用户无论在页面中的哪个位置都会返回。

【问题讨论】:

  • 如果当前元素应该包含在结果数组中,filter 回调应该返回一个布尔值,并且slice 应该在返回的过滤数组上。您能告诉我们过滤/切片代码/逻辑以及您想要/期望发生的事情吗?
  • @DrewReese 我期待一个带分页的全局搜索。这意味着如果搜索结果超过 10 的限制,它将分成页面。如果我要搜索用户,它会返回所有结果,尽管它在其他页面中。对不起,如果我不清楚
    我试图在这里切片目标,但它返回一个 target.slice 而不是函数错误
  • 不,我的意思是更多从 const filter = req.query;result = await query.skip(skip).limit(pageSize); 开始,并引导我们完成代码以及您想要/期望它做什么。
  • @DrewReese 在开始时设置了一些来自 api 调用的参数。 filter 获取它想要的值,例如:localhost:5000/users/?filter=user5。所以它应该从数据库中获取 user5。但是现在因为我已经对 web localhost:5000/users/?filter=&page=2 进行了分页,所以如果 user5 在第 2 页中,它只会返回 user5。我添加了几张照片
  • 那么问题是“当搜索值不在请求的页面上时如何重新计算调整页面”?

标签: node.js reactjs mongodb


【解决方案1】:

对于过滤器,您可以使用 $regex 运算符来代替过滤器功能。并使用 HTTP post 方法从请求正文而不是 get 获取输入。

router.route('/').post(async (req, res) => {    
 try {
    const filter = req.body.query;
    let where = {};
    if (filter.name) {
        where.name = { $regex: filter.name, $options: "i" }
    }
    let query = User.find(where);
    const page = parseInt(req.body.page) || 1;
    const pageSize = parseInt(req.body.limit) || 10;
    const skip = (page - 1) * pageSize;
    const total = await User.countDocuments(where);
    const pages = Math.ceil(total / pageSize);

    if (page > pages) {
        return res.status(404).json({
            status: "fail",
            message: "No page found",
        });
    }
    result = await query.skip(skip).limit(pageSize);
    res.json({
        status: "success",
        filter,
        count: result.length,
        page,
        pages,
        data: result
    });
} catch (error) {
    console.log(error);
    res.status(400).json({
        status: "error",
        message: "Server Error",
    });
  }
 });

请求正文进行分页 -

{
  "query":{"name":"jo"}
  "page":1,
  "limit":3
}

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2015-02-01
    • 1970-01-01
    • 2015-05-25
    • 2014-10-05
    • 2012-12-03
    相关资源
    最近更新 更多