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

PostgreSQL pg库调用pool.end()报错,pool.end()的正确使用时机是什么?

报错原因

你的代码中pool.query采用异步回调执行模式,同层级的pool.end()会在查询请求发出后立刻执行,不等数据库返回结果、也不等回调函数触发,就直接销毁了整个连接池的所有连接。等数据库响应返回时,连接已经被关闭,回调无法拿到正常的results返回对象,就会触发你遇到的Cannot read property 'rows' of undefined报错。

pool.end()的正确使用时机

连接池的核心作用是复用数据库连接,避免频繁创建销毁连接的性能损耗,本身就是为长期运行的服务设计的:

  • 常规Web服务场景下,你只需要在服务启动时初始化一次连接池,服务运行全程不需要主动调用pool.end(),连接池会自动管理连接的复用、空闲释放逻辑。
  • 只有确认后续不会再产生任何数据库查询请求时,才需要调用pool.end(),常见场景只有两类:
    • 一次性运行的脚本任务,所有数据库操作都执行完毕、准备退出进程前
    • 服务收到停机信号,准备做优雅退出前

注意:不要在任何接口请求的处理逻辑中调用pool.end(),一旦连接池被关闭,后续的所有请求都无法正常获取数据库连接。

代码修正方案

你当前的Express服务场景完全不需要在接口请求逻辑里加pool.end(),直接删除注释的那行代码即可,连接池会自动处理后续所有请求的数据库连接需求。
如果需要做服务优雅停机,可以额外加一段进程信号监听逻辑,在服务退出前再关闭连接池:

// 监听进程终止信号,优雅关闭数据库连接池
process.on('SIGINT', async () => {
  await pool.end()
  console.log('数据库连接池已正常关闭,服务退出')
  process.exit(0)
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:51:03