PostgreSQL+Node.js API:参数为Null时如何获取全量数据?
解决PostgreSQL分类筛选参数为Null时的查询问题
你的核心问题有两个:一是直接拼接SQL字符串导致Null被当作字符串'null'传入,二是当前代码存在严重的SQL注入风险。以下是具体修复方案:
1. 先处理参数转换
判断路由参数中的wallet是否为字符串'null',如果是则转为JS的真实null值:
const walletParam = req.params.wallet.toLowerCase() === 'null' ? null : req.params.wallet;
2. 改用参数化查询(必须)
绝对不要直接拼接用户输入到SQL语句中,这会引发SQL注入攻击。使用PostgreSQL客户端支持的参数占位符($1、$2等)来传递参数:
修改后的完整路由代码:
dexRouter.get("/:trades/:chain/:txn/:wallet", async (req, res) => { try { // 处理参数,将字符串'null'转为真实null const walletParam = req.params.wallet.toLowerCase() === 'null' ? null : req.params.wallet; const tradesCount = parseInt(req.params.trades, 10); const chainId = req.params.chain; const txnMultiplier = parseInt(req.params.txn, 10); // 参数化查询,用$1-$4作为占位符 const result = await db.query( `SELECT * FROM dextrades WHERE chain_id = $1 AND txn_value > (50000 * $2) AND (category LIKE $3 OR $3 IS NULL) ORDER BY trade_time DESC LIMIT $4;`, [chainId, txnMultiplier, walletParam ? `%${walletParam}%` : null, tradesCount] ); res.status(200).json(result.rows); } catch (err) { console.error(err); res.status(500).json({ error: '查询失败' }); } });
3. 调整SQL条件逻辑
原SQL的Coalesce写法无法正确识别null参数,改用(category LIKE $3 OR $3 IS NULL):
- 当
$3为null时,条件直接成立,返回所有记录 - 当
$3是带通配符的字符串时,执行模糊匹配
如果你的需求是精确匹配而非模糊查询,可修改为:
AND (category = $3 OR $3 IS NULL)
同时去掉参数中的通配符拼接:
const walletParam = req.params.wallet.toLowerCase() === 'null' ? null : req.params.wallet;
关键注意事项
- 参数化查询既能正确传递null值,又能彻底避免SQL注入,是生产环境的必备规范
- 对路由参数做类型转换(如
parseInt转数字),避免类型错误 - 增加错误捕获,返回友好的错误提示
内容的提问来源于stack exchange,提问作者Husnain Mehmood
相关产品推荐
相关产品推荐

