3 votes

Pagination de noeuds avec express

Je dois construire une API en tant que serveur côté, qui devrait fournir des résultats en pages de 10 entrées, en utilisant uniquement Node avec express (aucun autre package).

  • Un paramètre de requête p spécifie quelle page retourner, en commençant par 1. Si le paramètre p est omis, la valeur par défaut est 1.

  • Si le côté client demande /api/stories?p=1, ils devraient seulement obtenir 10 histoires, en commençant par la plus récente.

  • Si p=2, l'API doit renvoyer le second lot de 10 histoires. Lorsqu'une page d'histoires est renvoyée, elle doit être ordonnée avec l'histoire la plus récente en premier.

  • Si p est supérieur au dernier numéro de page, l'API doit renvoyer la dernière page disponible.

  • La valeur page est la page actuellement retournée. Si la page demandée p est supérieure au dernier numéro de page, la valeur de page renvoyée indiquera le dernier numéro de page.

  • La valeur pageCount est le nombre de la dernière page non vide.

Voici ce que j'ai pour la pagination...

//pagination
const pageLimit = 10;
app.get('/api/posts', function(req, res) {
  res.json({
    "posts": posts.slice(-pageLimit).reverse(),
    "page": 1,
    "pageCount": Math.ceil(posts.length / 10)
  });
});

Le retour est correct avec 10 articles par page, les 11e, 21e, 31e articles sont poussés sur la 2e, 3e page, etc. Maintenant, mon problème survient lorsque j'essaie de passer de la page 1 à la page 2 (comme page suivante) rien ne se passe...

Je suppose que je dois implémenter quelque chose comme un bouton "suivant" mais je n'ai aucune idée de comment le faire

Toute aide serait appréciée...

8voto

Gallex Points 127

Après avoir passé deux jours à me creuser la tête, j'ai trouvé une solution qui fonctionne pour moi.. Merci num8er de m'avoir orienté dans la bonne direction...

app.get('/api/posts', (req, res) => {
  const pageCount = Math.ceil(posts.length / 10);
  let page = parseInt(req.query.p);
  if (!page) { page = 1;}
  if (page > pageCount) {
    page = pageCount
  }
  res.json({
    "page": page,
    "pageCount": pageCount,
    "posts": posts.slice(page * 10 - 10, page * 10)
  });
});

3voto

num8er Points 10385

Consultez ceci :

app.get('/api/posts', (req, res) => {
  const postCount = posts.length;
  const perPage = 10;
  const pageCount = Math.ceil(postCount / perPage);

  let page = parseInt(req.query.p);
  if(page < 1) page = 1;
  if(page > pageCount) page = pageCount;

  const from = postCount - ((page - 1) * perPage) - 1; // ex.: 44 - ((1 - 1) * 10) -1 = 43 (44 is count, 43 is index)
  let to = postCount - (page * perPage); // ex.: 44 - (1 * 10) = 34
  if(to < 0) to = 0;

  res.json({
    posts: posts.slice(from, to).reverse(),
    page,
    pageCount
  });
});

P.S. Si le tableau posts est récupéré de la base de données - je recommande vivement d'utiliser les capacités de la base de données pour récupérer les données nécessaires. Sinon, récupérer des milliers de pages puis découper le tableau en 10 éléments entraînera des problèmes de performances.

2voto

John Kennedy Points 2490
export default (limite, decalage, total) => {
  const donneesPage = {};
  limite = limite > total ? total : limite;
  decalage = decalage > total ? total : decalage;

  donneesPage.page = Math.floor(decalage / limite) + 1;
  donneesPage.nombrePages = Math.ceil(total / limite);
  donneesPage.taillePage = Number(limite);
  donneesPage.totalElements = total;

  return donneesPage;
};

1voto

yBrodsky Points 3842

Vous y êtes presque. Il vous manque une partie, voici un exemple pratique :

let records = [
  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
];
let pageSize = 5;

function paginate(page = 1) {
    // lorsque la page est 1, nous allons de l'index 0 à l'index 4
    // c'est les 5 premiers enregistrements.
    return records.slice(pageSize * (page - 1), pageSize * page);
}

console.log(paginate(1));
console.log(paginate(2));
console.log(paginate(3));

https://jsfiddle.net/fe4s2qxv/

0voto

Pagination des noeuds avec sequelize
le client doit fournir la page et la taille de la page
const page = 1 const pageSize = 2 const offset = page * pageSize const limit = offset + pageSize return model .findAll({ attributes: [], include: [{}], limit, offset }) .then((tasks) => res.status(200).send(tasks)) .catch((error) => { console.log(error); res.status(400).send(error); });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X