使用pg-promise的Node.js脚本执行完成后挂起数秒才退出是什么原因
问题原因
pg-promise底层依赖node-postgres的连接池,默认会保持空闲连接存活10秒,用来复用连接减少下次查询的握手开销。只要连接池里还有活跃的连接句柄,Node.js事件循环就判定还有未完成的任务,不会立刻退出,直到空闲连接超时被自动释放后,脚本才会正常退出。
你补充的去掉数据库查询后脚本立刻退出,也验证了是数据库连接池持有活跃句柄导致的挂起。
解决方案
只需要在所有数据库操作完成后,手动调用pg-promise提供的end()方法关闭连接池,释放所有连接句柄即可,修改后的代码如下:
import pgpPackage from 'pg-promise'; const pgp = pgpPackage(); const env = { dbUrl: process.env.DB_URL }; const app = { db: pgp(env.dbUrl), }; const main = async () => { console.log(await app.db.any('select 1')); return 42; }; try { const x = await main(); console.log('all ok, main returned', x); } catch (err) { console.log('an error occurred:', err); } finally { // 手动关闭连接池,释放所有连接 pgp.end(); // 也可以用 app.db.$pool.end() 效果一致 }
修改后脚本执行完所有逻辑就会立刻退出,不会再出现10秒的挂起。
内容的提问来源于stack exchange,提问作者ffigari
相关产品推荐
相关产品推荐

