Node.js Postgres查询返回undefined而非预期结果求助
问题分析与修复方案
问题根源
你的getClasses函数返回undefined的核心原因有两个:
pool.connect的回调模式不支持async回调的返回值——你在async回调里return listOfClasses.rows,但这个返回值不会被外层函数捕获,return pool.connect(...)实际返回的是pool.connect自身的返回值(并非你需要的查询结果)。- 连接出错时只打印错误,没有返回或抛出错误,导致函数无返回值。
修复方案
推荐使用Promise风格的连接方式(和你已有的async/await语法更契合):
const { pool } = require("./database"); async function getClasses(user) { let client; try { // 用await获取连接客户端 client = await pool.connect(); const sqlText = `SELECT * FROM "public"."classes" WHERE "admins" = $1`; const values = [user]; const listOfClasses = await client.query(sqlText, values); console.log(listOfClasses.rows); return listOfClasses.rows; } catch (err) { console.log(err); // 抛出错误让调用者处理,也可以返回空数组等默认值 throw err; } finally { // 确保无论成功失败都释放连接 if (client) client.release(); } } module.exports = { getClasses };
如果需要保留回调风格,需手动封装Promise:
const { pool } = require("./database"); async function getClasses(user) { return new Promise((resolve, reject) => { pool.connect((err, client, done) => { if (err) { console.log(err); reject(err); return; } const sqlText = `SELECT * FROM "public"."classes" WHERE "admins" = $1`; const values = [user]; client.query(sqlText, values, (queryErr, result) => { done(); // 必须释放连接 if (queryErr) { console.log(queryErr); reject(queryErr); return; } console.log(result.rows); resolve(result.rows); }); }); }); } module.exports = { getClasses };
补充说明
- 在pg库中,Promise风格的连接推荐用
await pool.connect()获取客户端,结束后调用client.release()释放,替代回调模式的done()。 - 错误处理要完整,要么抛出错误让上层处理,要么返回默认值,避免函数无返回值。
内容的提问来源于stack exchange,提问作者filroy-codes
相关产品推荐
相关产品推荐

