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

Node.js+Express+MySQL API改造:添加first_name的LIKE模糊查询

实现Express+MySQL API中first_name字段的模糊查询(带条件判断)

嗨,我来帮你搞定这个模糊查询的需求!核心思路就是:只有当请求携带了first_name参数时,才把模糊匹配的条件加入SQL查询,同时严格避免SQL注入风险——这两点都得兼顾到,下面一步步给你讲怎么改。

先看你原来的代码逻辑(假设结构)

首先我先还原一下你现有代码的大概样子,方便你对应修改:

const express = require('express');
const router = express.Router();
const mysql = require('mysql2/promise'); // 用promise版更适合异步场景

// 数据库连接配置
const dbConfig = {
  host: 'localhost',
  user: 'your_db_user',
  password: 'your_db_pwd',
  database: 'your_db_name'
};

router.get('/users', async (req, res) => {
  try {
    const connection = await mysql.createConnection(dbConfig);
    let baseQuery = 'SELECT * FROM users';
    const queryParams = [];
    const whereConditions = [];

    // 原来的精确匹配逻辑
    if (req.query.first_name) {
      whereConditions.push('first_name = ?');
      queryParams.push(req.query.first_name);
    }
    // 其他字段的精确匹配逻辑(比如last_name、email等)...

    // 拼接WHERE子句(如果有条件的话)
    if (whereConditions.length > 0) {
      baseQuery += ' WHERE ' + whereConditions.join(' AND ');
    }

    const [results] = await connection.execute(baseQuery, queryParams);
    connection.end();
    res.json(results);
  } catch (error) {
    console.error('查询出错:', error);
    res.status(500).json({ error: '服务器内部错误' });
  }
});

module.exports = router;

修改first_name的查询逻辑(关键步骤)

你只需要把原来first_name的精确匹配条件,改成LIKE模糊匹配,而且要通过参数占位符安全传递(绝对不能直接拼字符串到SQL里!):

// 替换原来的first_name条件判断
if (req.query.first_name && req.query.first_name.trim() !== '') {
  // 用LIKE语法,并且把参数包装成%xxx%,通过?占位符传递
  whereConditions.push('first_name LIKE ?');
  queryParams.push(`%${req.query.first_name.trim()}%`);
}

为什么这么改?

  • 安全优先:用?占位符让mysql2自动做参数转义,彻底杜绝SQL注入风险——如果直接写first_name LIKE '%${req.query.first_name}%',恶意用户可以构造参数篡改你的SQL语句,非常危险。
  • 符合需求:只有当first_name参数存在且非空时,才会加入这个模糊匹配条件,完全满足你“仅在参数设置时应用搜索条件”的要求。
  • 体验优化:加了.trim()可以过滤用户不小心输入的前后空格,避免无效查询。

测试验证

修改完后,你可以用这样的请求测试:

GET /users?first_name=John

这会返回所有first_name字段中包含"John"的用户,比如Johnathan、John Doe、Jane Johnsson等等。

额外注意事项

  • 如果你用的是回调版的mysql包(不是mysql2/promise),逻辑完全一样,只是把async/await换成回调函数,参数依然通过数组传递给query方法。
  • 如果需要支持大小写不敏感的模糊查询,可以根据你的MySQL配置调整:比如在字段前加LOWER(),同时把参数转成小写:
    whereConditions.push('LOWER(first_name) LIKE ?');
    queryParams.push(`%${req.query.first_name.trim().toLowerCase()}%`);
    

内容的提问来源于stack exchange,提问作者Philipp M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:41:55