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
相关产品推荐
相关产品推荐

