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

调用异步函数后Node.js PostgreSQL程序未终止问题咨询

程序运行后不终止的原因及解决方法

原因

你用postgres包创建的sql客户端实例默认会维持一个数据库连接池,连接池会保留活跃的数据库连接用于复用,Node.js进程因为存在未释放的资源(连接池),会一直保持运行状态,不会自动退出。

解决方法

方法一:查询完成后手动关闭连接池

在数据查询完成后调用sql.end()方法关闭整个连接池,释放所有占用的资源,进程就能正常终止:

import postgres from 'postgres'
import "dotenv/config"

const sql = postgres({
  host: process.env.DATABASE_HOST,
  database: process.env.DATABASE_NAME,
  username: process.env.DATABASE_USER,
  password: process.env.DATABASE_PASSWORD,
  ssl: 'require',
})

async function getInfo() {
  const users = await sql`
  select * from information_schema.tables
  `
  // 关闭连接池,释放所有资源
  await sql.end()
  return users
}

getInfo().then((data) => console.log(data))

方法二:按需配置连接池(适合脚本场景)

如果是一次性执行的脚本,可以初始化客户端时限制连接池的最大连接数为1,再配合手动关闭连接池,更贴合脚本的使用场景:

import postgres from 'postgres'
import "dotenv/config"

const sql = postgres({
  host: process.env.DATABASE_HOST,
  database: process.env.DATABASE_NAME,
  username: process.env.DATABASE_USER,
  password: process.env.DATABASE_PASSWORD,
  ssl: 'require',
  max: 1, // 限制连接池仅保留1个连接
})

async function getInfo() {
  const users = await sql`
  select * from information_schema.tables
  `
  await sql.end()
  return users
}

getInfo().then((data) => console.log(data))

补充说明

如果是长期运行的服务(比如API后端),不需要关闭连接池,连接池的复用机制能提升数据库操作的性能;但对于一次性执行的脚本,必须手动关闭连接池才能让Node.js进程正常终止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:05:13