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

Promise调用PostgreSQL接口失效,Async/Await可正常运行,求排查

问题:使用Promise.then调用PostgreSQL查询返回Promise { <pending> },Async/Await则正常

核心原因

你失效的代码里,getServerSideProps是普通函数,没等Promise完成就直接返回了未resolved的Promise对象。Next.js的getServerSideProps处理异步逻辑时,要么用async/await,要么返回一个能resolve出props对象的Promise。

另外还有两个额外问题:

  • 重复获取result.rows:getUsers里已经在.then中返回了result.rows,所以在getServerSideProps的.then里再取result.rows会得到undefined
  • 错误处理隐患:getUsers的.catch返回错误消息字符串,组件拿到后调用map会直接崩溃,应该抛出错误或返回空数组

修复方案

1. 先修正getUsers的错误处理(推荐)

const db = require("../config/db");

const getUsers = () => {
  const query = "SELECT * FROM users";
  return db
    .query(query)
    .then((result) => result.rows)
    .catch((error) => {
      console.error("获取用户失败:", error);
      // 要么抛出错误让上层处理,要么返回空数组避免组件崩溃
      throw new Error(error.message);
      // 或者用 return [];
    });
};

module.exports = { getUsers };

2. 修复getServerSideProps(Promise方式)

让getServerSideProps直接返回Promise,在Promise完成后再返回props:

const { getUsers } = require('../helpers/users')

export default function Home(props) {
  return (
    <ul>
      {props.name}
      {props.users.map(user => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  )
}

export function getServerSideProps(context) {
  return getUsers()
    .then((users) => {
      return { props: { users } };
    })
    .catch((error) => {
      console.error("获取用户失败:", error);
      return { props: { users: [] } };
    });
}

3. 或者用更简洁的Async/Await方式(你的正常版本优化)

export async function getServerSideProps(context) {
  try {
    const users = await getUsers();
    return { props: { users } };
  } catch (error) {
    console.error("获取用户失败:", error);
    return { props: { users: [] } };
  }
}

为什么原来的Promise方式失效?

原来的代码中,const users = getUsers().then(...)得到的是一个未完成的Promise,而getServerSideProps作为普通函数直接返回{ props: { users } },Next.js不会自动解析这个Promise,导致组件拿到的是Promise对象而非实际用户数据,所以控制台输出Promise { <pending> },且调用map时会报错。

而Async/Await版本中,await会阻塞直到getUsers()的Promise完成,拿到实际的用户数组后再返回给props,因此能正常渲染。

内容的提问来源于stack exchange,提问作者Thiru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:40:16