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

Express.js中如何根据可选路由生成不同SQL查询?

当然可以!这里是实现思路和优化后的代码

你的问题在于当前代码不管有没有传入book这个可选路由参数,都固定使用了包含AND book = ?的SQL语句——当没传book时,req.params.book会是undefined,这会导致查询条件变成book = undefined,大概率查不到任何结果。

我们可以通过判断可选参数是否存在,动态生成对应的SQL查询和参数数组,同时保持参数化查询的安全性(避免SQL注入):

app.get('/:genre/:book?', function (req, res) {
  const genre = req.params.genre;
  const book = req.params.book;
  
  // 初始化SQL语句和参数数组
  let sql;
  let queryParams;

  if (book) {
    // 传入了book参数:同时匹配genre和书名
    sql = 'SELECT * FROM books WHERE genre = ? AND book = ?';
    queryParams = [genre, book];
  } else {
    // 没传book参数:只查询该分类下的所有书籍
    sql = 'SELECT * FROM books WHERE genre = ?';
    queryParams = [genre];
  }

  con.query(sql, queryParams, (err, rows) => {
    if (err) {
      // 生产环境别直接throw,返回友好错误更稳妥
      console.error('查询出错:', err);
      return res.status(500).send('查询失败,请稍后重试');
    }
    res.send(rows);
  });
});

如果喜欢更简洁的写法,也可以用三元表达式一行搞定SQL和参数的判断:

app.get('/:genre/:book?', function (req, res) {
  const genre = req.params.genre;
  const book = req.params.book;

  // 用三元表达式动态生成SQL和参数
  const [sql, queryParams] = book 
    ? ['SELECT * FROM books WHERE genre = ? AND book = ?', [genre, book]]
    : ['SELECT * FROM books WHERE genre = ?', [genre]];

  con.query(sql, queryParams, (err, rows) => {
    if (err) {
      console.error('查询出错:', err);
      return res.status(500).send('查询失败,请稍后重试');
    }
    res.send(rows);
  });
});

几个关键注意点:

  • 永远不要直接把用户输入(包括路由参数)拼接到SQL字符串里,一定要用参数化查询,避免SQL注入风险。
  • 生产环境中不要直接throw err,这样会导致服务器崩溃,应该捕获错误并返回HTTP 500状态码和友好提示。
  • 可以根据需求扩展逻辑,比如当book参数为空字符串时的处理(不过路由参数默认不会是空字符串,除非用户刻意构造)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:59:01