如何使用跳过和限制在 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 的帮助下通过以下方法插入数据:
输出:没有分页
从上面的例子可以看出,如果没有分页,所有的文档都会被获取。更清楚地了解 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
输出:分页