#node.js #angular #mongodb #mongoose #pagination
#node.js #angular #mongodb #мангуст #разбивка на страницы
Вопрос:
Это скорее вопрос дизайна, чем большого количества кода. У меня есть клиент angular, который запрашивает коллекцию mongodb через http и серверную часть nodejs. Я хочу разбить результат на страницы, поэтому я делаю это на угловой стороне, отслеживаю страницу, на которой я нахожусь, и количество результатов, которые я хотел бы получить на каждой странице, и передаю это на свой серверный сервер через HTTP-вызов. Тогда в моем бэкэнде есть код, который выглядит примерно так:
schema.find({name: query, _userId: req.body._userId}).sort({ name: 'asc' }).limit(req.body.num_results).skip(req.body.page * req.body.num_results).then(response => {
Теперь я хотел бы поместить стрелки «<» и «>» в html моего клиента, где каждый раз, когда щелкают влево или вправо, он пересекает страницы (с помощью нового http-вызова), но затем сделайте так, чтобы «<» было отключено на странице 0, а «>» отключено напоследняя страница результатов. Я выяснил, как отключить «<» — просто сделайте так, чтобы кнопка исчезла, когда вы находитесь на странице 0. Но возникли проблемы с поиском наилучшего способа обнаружить, что я нахожусь на последней странице. Одним из методов могло бы быть, чтобы мой серверный сервер возвращал общее количество результатов, а затем мои интерфейсные треки, где я отношусь к общему #, но для этого требовался еще один вызов БД, перемещение переменных, передаваемых по http, больше управления во внешнем интерфейсе. Есть идеи о том, как реализовать «более чистое» решение?
Спасибо.
Ответ №1:
Вам не нужно делать никаких дополнительных вызовов api. Вы можете возвращать любую дополнительную информацию в виде Http-заголовка при вызове api. итак, в этом случае возвращаем X-TOTAL-COUNT
Комментарии:
1. Спасибо — как я могу получить ответ. длина для оригинала . найдите, прежде чем я применю все фильтры (или мне нужно выполнить отдельный запрос?)
2. вот пример кода / GET get all Products router.get(‘/products’, requireJWT, hasPermission, (req, res) => { const { страница = 0, размер страницы = 1000, сортировка = -1 } = запрос. запрос Product.find() .lean() .sort({ _id: sort }) .limit(Number(pageSize)) .skip(Number(page) * Number(pageSize)) .затем(document => { // Отправьте их обратно в качестве ответа res.setHeader(‘X-TOTAL-COUNT’, документ. длина); res.json(документ) }) .catch(ошибка => { res.status(400).json({ ошибка: ошибка.сообщение }) }) })
3. Спасибо, я попробовал этот код и документ. длина возвращает только размер страницы, поскольку он идет после предела. Как мне получить общую длину документа #?
4. мой плохой .. вы должны сделать еще один вызов, такой как const total=await Product.find().length;