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
相关产品推荐
相关产品推荐

