Node.js中执行PostgreSQL查询获取表行数并赋值给变量的问题
核心错误原因
- 混用回调、Promise、async/await三种异步处理逻辑:pg的
query方法如果传入回调函数就不会返回Promise,await无法拿到有效值 - 取值逻辑错误:pg查询返回的结果会把所有行数据放在
rows数组中,count查询仅返回1行结果,需要取result.rows[0].total才能拿到计数值,直接取result.total必然返回undefined - async函数本身返回Promise对象:直接调用async函数拿到的是Promise实例,必须用
await或者.then()才能拿到函数内部return的数值 - 额外错误:你在第二段代码的then回调里已经return了数字类型的计数值,后续直接用
ioResult即可,ioResult.total相当于给数字取total属性,自然是undefined
修正后可直接运行的代码
你可以直接把外层then的回调改为async函数,内部就可以直接用await拿到计数值:
// 注意这里把then的回调改为async函数 db_connnection.query(display_query).then(async result => { io.to(roomId).emit('room-display-update', result.rows); // 计数查询不要传回调,直接await返回的Promise const countResult = await db_connnection.query("SELECT COUNT(*) as total FROM waypoint"); // 从rows数组第一个元素取total字段,转成整数 const n = parseInt(countResult.rows[0].total); // 所有需要用到n的后续逻辑都写在这里,或者把n作为参数传入其他函数调用 console.log("表总行数为:", n); }).catch(err => { // 统一捕获查询错误,方便排查 console.error("查询出错:", err); });
单独封装计数查询的写法
如果你需要把计数逻辑抽成独立函数,写法如下:
async function countWaypointRows(db_connnection) { const countResult = await db_connnection.query("SELECT COUNT(*) as total FROM waypoint"); return parseInt(countResult.rows[0].total); } // 调用时必须在async上下文内await const n = await countWaypointRows(db_connnection); console.log(n);
内容的提问来源于stack exchange,提问作者PPrime
相关产品推荐
相关产品推荐

