异步查询数据库返回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
相关产品推荐
相关产品推荐

