Node+Express构建REST API:分页模糊查询的总条数获取问题
解决Express+MySQL分页查询时返回固定总记录数的问题
嘿,我懂你这个需求——做商品分页查询的时候,不管用户翻到第几页,都得把符合模糊条件的总记录数(比如你说的16条)一起返回给前端对吧?这在REST API里太常见了,我给你捋清楚怎么实现:
核心思路其实很简单:同时执行两个SQL查询——一个拿当前页的分页数据,另一个拿符合条件的所有记录总数,最后把这两个结果打包成JSON返回就行。
具体实现步骤
1. 准备SQL语句
针对「全脂牛奶」的模糊查询,你需要两个SQL:
- 分页数据查询(带LIMIT):用来获取当前页的商品列表
SELECT * FROM products WHERE product_name LIKE '%全脂牛奶%' LIMIT ?, ? - 总记录数查询(不带LIMIT):用来获取所有符合条件的商品总数(也就是你要的16)
SELECT COUNT(*) AS total FROM products WHERE product_name LIKE '%全脂牛奶%'
注意:两个SQL的
WHERE条件必须完全一致!不然总条数会和分页数据不匹配。
2. Express接口代码实现
我用mysql2(支持Promise,异步代码更清爽)来写示例,你可以直接参考:
首先引入依赖并配置数据库:
const express = require('express'); const mysql = require('mysql2/promise'); const app = express(); app.use(express.json()); // 替换成你的数据库配置 const dbConfig = { host: 'localhost', user: 'your_db_user', password: 'your_db_pwd', database: 'your_db_name' };
然后写分页查询接口:
app.get('/api/products', async (req, res) => { try { // 从请求参数里拿分页和查询关键词,给默认值避免报错 const pageNum = parseInt(req.query.pageNum) || 1; const pageSize = parseInt(req.query.pageSize) || 10; const keyword = req.query.keyword || ''; // 这里就是用户传的「全脂牛奶」 // 计算分页的起始偏移量(LIMIT的第一个参数) const offset = (pageNum - 1) * pageSize; // 建立数据库连接 const conn = await mysql.createConnection(dbConfig); // 第一步:查总记录数 const [countRows] = await conn.execute( 'SELECT COUNT(*) AS total FROM products WHERE product_name LIKE ?', [`%${keyword}%`] // 用参数化查询防SQL注入,别直接拼字符串! ); const totalCount = countRows[0].total; // 这里就是你要的固定总条数16 // 第二步:查当前页的商品数据 const [productList] = await conn.execute( 'SELECT * FROM products WHERE product_name LIKE ? LIMIT ?, ?', [`%${keyword}%`, offset, pageSize] ); // 关闭连接 await conn.end(); // 返回结构化的JSON结果 res.status(200).json({ code: 200, msg: '查询成功', data: { total: totalCount, // 不管pageNum是1还是2,这里始终是16 pageNum, pageSize, list: productList } }); } catch (err) { console.error('查询出错:', err); res.status(500).json({ code: 500, msg: '服务器内部错误' }); } }); // 启动服务 app.listen(3000, () => { console.log('API服务运行在 http://localhost:3000'); });
关键注意点
- 参数化查询:一定要用
?占位符来传递用户输入的关键词,绝对不能直接把keyword拼进SQL字符串里,不然会有SQL注入风险。 - 异步处理:用
async-await处理数据库查询的异步操作,比回调函数可读性高太多。 - 结果结构:返回的JSON里明确包含
total字段,前端可以用这个值计算总页数、渲染分页组件,体验更流畅。
测试一下:当你请求/api/products?keyword=全脂牛奶&pageNum=1或者pageNum=2时,返回的data.total都会是16,而list则是对应页的商品数据,完全符合你的需求。
内容的提问来源于stack exchange,提问作者wen tian
相关产品推荐
相关产品推荐

