如何在Node.js Express框架中获取URL查询参数的键名与对应值
实现方案
1. 获取动态查询参数键值
Express 框架中req.query会自动解析URL后的查询参数为对象,对于https://MY_LINK/post?1234=test这种单键值对的查询参数,可以通过Object.keys()直接获取键名:
// 路由不需要提前定义key、value路径参数 app.get('/post', (req, res) => { // 提取所有查询参数的键名 const queryKeys = Object.keys(req.query); // 校验是否传入查询参数 if (queryKeys.length === 0) { return res.status(400).send('缺少必要查询参数'); } // 取第一个键名,就是示例中的'1234' const targetKey = queryKeys[0]; // 对应的值就是示例中的'test' const targetValue = req.query[targetKey]; // 后续业务逻辑 });
如果请求可能携带多个查询参数,可以根据业务需求调整取第几个键,或者遍历所有键值对拼接查询条件。
2. 安全改造建议
你当前直接拼接SQL的写法存在严重的SQL注入风险,恶意用户可以通过构造特殊参数执行任意SQL语句,建议做两层安全校验:
- 列名白名单校验:提前定义允许作为查询条件的列,避免用户传入非法列名操作数据
- 参数化查询:使用数据库驱动提供的占位符能力转义用户输入的参数值
以常用的mysql驱动为例,改造后的代码如下:
// 定义允许查询的列白名单,按需替换为你的业务字段 const ALLOWED_QUERY_COLUMNS = ['id', 'name', 'phone', '1234']; app.get('/post', (req, res) => { const queryKeys = Object.keys(req.query); if (queryKeys.length === 0) { return res.status(400).send('缺少必要查询参数'); } const targetKey = queryKeys[0]; // 校验查询字段是否合法 if (!ALLOWED_QUERY_COLUMNS.includes(targetKey)) { return res.status(400).send('非法查询字段'); } const targetValue = req.query[targetKey]; // 使用占位符构造SQL,??用于转义标识符(列名、表名),?用于转义值 const sql = 'SELECT * FROM data WHERE ?? = ?'; db.query(sql, [targetKey, targetValue], (err, result) => { if (err) { return res.status(500).send('数据查询失败'); } res.send(result); }); });
内容的提问来源于stack exchange,提问作者Sasmita
相关产品推荐
相关产品推荐

