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

异步查询数据库返回Promise { pending }或undefined该如何解决

问题根因
  • 你的select函数没有向外层返回查询结果:内部return resultado.rows仅作用于.then()的回调函数作用域,无法传递到select函数外层,所以即使加了await也会拿到undefined
  • client.connect()传入回调参数时不会返回Promise,await操作无法等待回调内的逻辑执行完成,导致select函数直接返回处于pending状态的空Promise
  • 代码末尾的process.exit()会在查询完成后直接终止Node进程,完全不符合接口服务的运行逻辑,会直接中断后续的结果返回操作
修复方案

调整select函数,统一用async/await语法避免回调嵌套,同时删除强制退出进程的逻辑:

export async function select(query)  {
  try {
    // 若client为pg连接池实例,可省略connect步骤,直接调用query即可,连接池会自动管理连接
    await client.connect()
    const resultado = await client.query(query)
    console.log('sucess!!')
    // 此处return为select函数的返回值,可被上层await拿到
    return resultado.rows
  } catch (erro) {
    console.log("erro: " + erro.message)
    // 抛出错误交给上层接口逻辑处理
    throw erro
  } finally {
    // 若为单次连接可在此调用client.end()释放连接,若为连接池调用client.release()
    console.log('Finished query execution')
  }
}

同时给上层接口逻辑增加错误捕获:

export const getGerente = async (req, res) => {
  try {
    const query = "SELECT * FROM inventory;"
    const r = await select(query)
    console.log(r) // 此处可正常打印查询结果
    return res.json({data: r, message:"teste"})
  } catch (err) {
    return res.status(500).json({message: '查询失败', error: err.message})
  }
}
补充说明
  • 若使用pg的连接池(new pg.Pool())初始化client,无需每次查询都调用connect方法,直接执行client.query即可,性能更高也更稳定
  • 接口服务运行时不要添加process.exit()逻辑,会直接终止整个服务,导致所有后续请求无法响应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:54:04