You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js Postgres查询返回undefined而非预期结果求助

问题分析与修复方案

问题根源

你的getClasses函数返回undefined的核心原因有两个:

  1. pool.connect的回调模式不支持async回调的返回值——你在async回调里return listOfClasses.rows,但这个返回值不会被外层函数捕获,return pool.connect(...)实际返回的是pool.connect自身的返回值(并非你需要的查询结果)。
  2. 连接出错时只打印错误,没有返回或抛出错误,导致函数无返回值。

修复方案

推荐使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:06:27