【发布时间】: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。我添加了几张照片
-
那么问题是“当搜索值不在请求的页面上时如何重新计算调整页面”?