📜  如何使用跳过和限制在 Node.js 中创建分页?

📅  最后修改于: 2022-05-13 01:56:49.746000             🧑  作者: Mango

如何使用跳过和限制在 Node.js 中创建分页?

Nodejs 是一个开源和跨平台的运行时环境,用于在浏览器之外执行 JavaScript 代码。它广泛用于开发从小型到大型公司的 API 和微服务。这是一个很棒的工具,因为它使开发人员能够在服务器端和客户端使用 JavaScript。

什么是分页?

分页是一种非常有用的方法。这允许客户端在页面中获取数据。这是通过使用选项跳过和限制来实现的,让客户完全控制他们返回的页面(数据)。

先决条件: Nodejs和Mongodb的基础知识。

何时使用分页?

正如其声明所述,应使用分页:

  • 当客户应该控制他们正在取回的数据时。
  • 改善用户体验 (UX) 和更好的导航。

创建项目

步骤 1:使用以下命令为项目创建一个新文件夹:

mkdir pagination

第 2 步:使用以下命令导航到我们的文件夹:

cd pagination

第 3 步:使用以下命令和服务器文件初始化 npm:

npm init -y
touch index.js

第 4 步:使用以下命令安装所需的软件包:

npm i express mongoose 

项目结构:它将如下所示

示例 1:不使用分页

index.js
// Requiring module
const express = require('express');
const mongoose = require('mongoose');
const port = 3000;
const app = express();
  
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
  
// Database URL
const MONGODB_URL = 'mongodb://127.0.0.1/pagination';
  
// Connecting Database through mongoose(ORM For Mongodb)
mongoose
    .connect(MONGODB_URL, {
        useCreateIndex: true,
        useFindAndModify: false,
        useUnifiedTopology: true,
        useNewUrlParser: true,
    })
    .then(() => {
        console.log('Database connected');
    })
    .catch((err) => {
        console.log('Error in connecting database');
    });
  
// Creating Schema for Posts, then it will
// be used in creating Model
const PostSchema = new mongoose.Schema({
    name: String,
    date: {
        type: Date,
        default: Date.now(),
    },
});
  
const postModel = new mongoose.model('PostModel', PostSchema);
  
// For creating Posts
app.post('/', async (req, res) => {
    const post = new postModel(req.body);
    await post.save();
    res.status(201).send('Successfully created');
});
  
// For Fetching Post
app.get('/', async (req, res) => {
    try {
        const posts = await postModel.find();
        res.status(200).send(posts);
    } catch (e) {
        console.log(e);
    }
});
  
// Starting the server
app.listen(port, () => {
    console.log(`Started at ${port}`);
});


index.js
// Requiring module
const express = require('express');
const mongoose = require('mongoose');
const port = 3000;
const app = express();
  
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
  
// Database URL
const MONGODB_URL = 'mongodb://127.0.0.1/pagination';
  
// Connecting Database through mongoose(ORM For Mongodb)
mongoose
    .connect(MONGODB_URL, {
        useCreateIndex: true,
        useFindAndModify: false,
        useUnifiedTopology: true,
        useNewUrlParser: true,
    })
    .then(() => {
        console.log('Database connected');
    })
    .catch((err) => {
        console.log('Error in connecting database');
    });
  
// Creating Schema for Posts, then it will
// be used in creating Model
const PostSchema = new mongoose.Schema({
    name: String,
    date: {
        type: Date,
        default: Date.now(),
    },
});
  
const postModel = new mongoose.model('PostModel', PostSchema);
  
// For creating Posts
app.post('/', async (req, res) => {
    const post = new postModel(req.body);
    await post.save();
    res.status(201).send('Successfully created');
});
  
// For Fetching Post
app.get('/', async (req, res) => {
    try {
        // Adding Pagination
        const limitValue = req.query.limit || 2;
        const skipValue = req.query.skip || 0;
        const posts = await postModel.find()
            .limit(limitValue).skip(skipValue);
        res.status(200).send(posts);
    } catch (e) {
        console.log(e);
    }
});
  
// Starting the server
app.listen(port, () => {
    console.log(`Started at ${port}`);
});


使用以下命令运行服务器

node index.js

插入数据库:在 Postman 的帮助下通过以下方法插入数据:

通过 Postman 向“/”路径发出 post 请求来插入数据库。

输出:没有分页

通过 Postman 获取数据而不使用分页。

从上面的例子可以看出,如果没有分页,所有的文档都会被获取。更清楚地了解 Pagination 的使用和需求。当有数千个文档而不是只有 4 个时,请考虑这种情况。

示例 2:使用分页

对于分页跳过和限制,参数将使用限制和跳过方法与查找一起使用。

index.js

// Requiring module
const express = require('express');
const mongoose = require('mongoose');
const port = 3000;
const app = express();
  
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
  
// Database URL
const MONGODB_URL = 'mongodb://127.0.0.1/pagination';
  
// Connecting Database through mongoose(ORM For Mongodb)
mongoose
    .connect(MONGODB_URL, {
        useCreateIndex: true,
        useFindAndModify: false,
        useUnifiedTopology: true,
        useNewUrlParser: true,
    })
    .then(() => {
        console.log('Database connected');
    })
    .catch((err) => {
        console.log('Error in connecting database');
    });
  
// Creating Schema for Posts, then it will
// be used in creating Model
const PostSchema = new mongoose.Schema({
    name: String,
    date: {
        type: Date,
        default: Date.now(),
    },
});
  
const postModel = new mongoose.model('PostModel', PostSchema);
  
// For creating Posts
app.post('/', async (req, res) => {
    const post = new postModel(req.body);
    await post.save();
    res.status(201).send('Successfully created');
});
  
// For Fetching Post
app.get('/', async (req, res) => {
    try {
        // Adding Pagination
        const limitValue = req.query.limit || 2;
        const skipValue = req.query.skip || 0;
        const posts = await postModel.find()
            .limit(limitValue).skip(skipValue);
        res.status(200).send(posts);
    } catch (e) {
        console.log(e);
    }
});
  
// Starting the server
app.listen(port, () => {
    console.log(`Started at ${port}`);
});

使用以下命令运行服务器

node index.js

输出:分页

使用 limit=2 和 skip=0 的分页返回前 2 个文档,