Express.js + PostgreSQL 按城市条件查询返回空数组问题排查
问题根源
空数组返回的核心原因是对字符串类型的路径参数做了完全不匹配的类型转换:
parseInt()的设计用途是将包含有效整数的字符串转为数字值,当传入纯文本类内容(比如城市名Tampa)时,该方法会直接返回NaN。- 实际传入数据库查询的筛选值不是预期的城市字符串,而是无效的
NaN,自然无法匹配到user_info表内的任何记录。由于查询本身不存在语法错误,后端会正常执行查询并返回200状态码,无法通过状态码直接定位问题。
字符串参数的正确处理方案
针对文本类型的路径参数,不需要做数值类的强制类型转换,按以下流程调整即可:
- 确认Express路由规则匹配正常
按城市查询的动态路由需定义为/info/:city格式,同时注意路由注册顺序:全量查询的静态路由/info要优先于同前缀的动态路由注册,避免出现路由匹配错位。 - 修正查询逻辑的参数传递
移除对req.params.city的parseInt()转换,直接将原始字符串值通过参数化查询传入数据库,参考代码对比例子:// 错误写法(当前bug的来源) const targetCity = parseInt(req.params.city) const queryRes = await pool.query('SELECT * FROM user_info WHERE city = $1', [targetCity]) // 正确写法 const targetCity = req.params.city const queryRes = await pool.query('SELECT * FROM user_info WHERE city = $1', [targetCity]) - 排查其他可能导致空查询的隐性问题
- 核对数据库内
city字段的实际存储大小写:如果库内存的是tampa、TAMPA等与请求参数大小写不一致的内容,严格等值匹配会返回空结果,可根据业务需求调整为大小写不敏感的匹配逻辑,例如WHERE LOWER(city) = LOWER($1) - 确认测试数据库中确实存在
city为Tampa的有效记录,排除测试数据缺失的干扰。
- 核对数据库内
内容的提问来源于stack exchange,提问作者khakiAfghan
相关产品推荐
相关产品推荐

