由于我必须渲染大数据,所以当我进行客户端分页时,这会花费一些时间,我知道服务器端分页最适合
但是我不知道如何使用NODE.JS EJS和MYSQL进行服务器端分页,这是我的Routes和.EJS
路线
app.get('/',function(req,res,next){
req.getConnection(function(error, conn) {
let sql = `SELECT *FROM studiestable
WHERE ReceivingDate >= ( CURDATE() - INTERVAL 35 DAY )
ORDER BY Bckup DESC,
ReceivingDate DESC`;
conn.query(sql,function(err,rows,fields){
if (err) {
req.flash('error', err)
res.render('patient/dashboard', {
title: 'Dashboard',
data: ''
})
} else {
res.render('patient/dashboard', {
title: 'Dashboard',
data: rows
})
}
})
})
})
EJS
<table id="pattTab" class="table small">
<tr style="background-color: rgb(122, 135, 160);color: white">
<th>ID</th>
<th>Patient Name</th>
<th>Age</th>
<th>Modality</th>
<th>Images</th>
</tr>
<% if (data) { %>
<% data.forEach(function(Patient){ %>
<tr>
<td><%= Patient.PatientID %></td>
<td><%= Patient.PatientName %></td>
<td><%= Patient.Age %></td>
<td><%= Patient.Modality %></td>
<td><%= Patient.Images %></td>
</tr>
<% }) %>
<% } %>
</table>
答案 0 :(得分:0)
您可能想尝试使用SQL的LIMIT
和OFFSET
进行分页。因此,您的Node的SQL字符串将类似于以下内容:
`SELECT * FROM studiestable
WHERE ReceivingDate >= ( CURDATE() - INTERVAL 35 DAY )
ORDER BY Bckup DESC,
ReceivingDate DESC`
LIMIT 30 OFFSET ${req.query.page*30};`
我知道,未经消毒地传递此类变量是非常不安全的,但这只是一个粗略的想法。
因此,在此过程中,您会收到一个名为page
的查询字符串(示例url:api.example.com/?page=0
)。我们假设页码从0开始。因此,page
等于0时,它将返回前30行(偏移量为0)。然后,当page
等于1(30个偏移量)时,它将返回接下来的30行。随着page
的增加,它会根据您的页面返回接下来的30组数据。
答案 1 :(得分:0)
如果您尝试进行分页,请按照以下方式进行。您的Node.JS文件
const ITEMS_PER_PAGE = 4;
exports.getIndex = (req, res, next) => {
// start constants
const page = +req.query.page || 1; // pagination
let totalItems; // pagination
// end constants
Hotel.find()
.countDocuments()
.then(numberOfProducts => {
totalItems = numberOfProducts;
return Hotel.find()
.skip((page-1) * ITEMS_PER_PAGE)
.limit(ITEMS_PER_PAGE);
}).then(hotels => {
res.render('pages/hotel', {
hotels: hotels,
currentPage: page,
hasNextPage: (ITEMS_PER_PAGE * page) < totalItems,
hasPreviousPage: page > 1,
nextPage: page + 1,
previousPage: page - 1,
lastPage: Math.ceil(totalItems / ITEMS_PER_PAGE)
});
}).catch(err => {
console.log(err);
});
}
然后以以下方式编写您的ejs:
<body>
<div class="jumbotron">
<div class="container">
<h1 class="display-4">Hotels</h1>
</div>
</div>
<div class="container">
<%if (hotels.length > 0) {%>
<div class="row">
<%for (let hotel of hotels) {%>
<div class="col-sm-4">
<div class="card mt-4" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title mt-2"><%=hotel.title%></h5>
<p class="card-text"><%=hotel.description%></p>
</div>
</div>
</div>
<%}%>
<div class="container mt-4">
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
<% if (hasPreviousPage) { %>
<li class="page-item">
<a class="page-link" href="?page=1">First</a>
</li>
<li class="page-item">
<a class="page-link" href="?page=<%= previousPage %>"><%= previousPage %></a>
</li>
<% } %>
<li class="page-item active">
<a class="page-link" href="?page=<%= currentPage %>"><%= currentPage %></a>
</li>
<% if (hasNextPage) { %>
<li class="page-item">
<a class="page-link" href="?page=<%= nextPage %>"><%= nextPage %></a>
</li>
<li class="page-item">
<a class="page-link" href="?page=<%= lastPage %>">Last</a>
</li>
<% } %>
</ul>
</nav>
</div>
</div>
<%} else {%>
<div class="text-center">
<h5>No products found.</h5>
<div class="mt-4">
<a href="/" class="btn btn-outline-primary">Go Home</a>
</div>
</div>
<%}%>
</div>
</body>
已使用CSS的引导程序。
这是您可以执行的操作。它将从数据库中获取一些项目并分页UI。