Node.js通过PostgreSQL API按城市查询数据返回空结果求助
问题排查与解决
核心问题:路由冲突
你的两个接口路由格式完全一致:/data/:id 和 /data/:city,Express 会优先匹配先定义的路由。当你请求 localhost:3000/data/dallas 时,实际触发的是 getDataById 函数——它会把 dallas 转成 NaN(parseInt('dallas') 返回 NaN),执行 SELECT * FROM data WHERE id = NaN 自然返回空结果。
解决方案
修改城市查询的路由路径,与ID查询路由做明确区分,比如改为 /data/city/:city:
1. 调整路由定义
假设原路由代码是:
app.get('/data/:id', getDataById); app.get('/data/:city', getDataCity); // 此路由会被上面的路由覆盖
修改为:
app.get('/data/:id', getDataById); app.get('/data/city/:city', getDataCity); // 新增标识性前缀避免冲突
2. 验证参数获取(可选)
你的getDataCity函数逻辑本身无问题,可添加日志确认参数是否正确:
const getDataCity = (request, response) => { const city = request.params.city; console.log('当前查询城市:', city); // 控制台打印参数,确认是否正确获取 pool.query('SELECT * FROM data WHERE city = $1', [city], (error, results) => { if (error) { throw error; } response.status(200).json(results.rows); }); };
3. 测试请求
使用新的接口地址发起请求:
$ curl localhost:3000/data/city/dallas
此时应该能返回预期的数据库结果。
额外排查点(若问题仍存在)
- 检查大小写匹配:PostgreSQL默认区分大小写,确认请求的城市名称与数据库中
city字段存储的内容完全一致(比如是否是Dallas而非dallas)。 - 查看数据库执行日志:开启PostgreSQL的查询日志,确认实际执行的SQL语句是否与预期一致。
内容的提问来源于stack exchange,提问作者ThisGuy
相关产品推荐
相关产品推荐

