You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:37:10