使用Knex与Google Cloud SQL Connector的Node.js进程无法退出
解决Knex连接Cloud SQL后进程无法退出的问题
你的问题出在没有关闭Cloud SQL Connector实例——Knex的destroy()只会关闭数据库连接池,但Connector本身维护的TCP代理连接还在占用资源,导致进程无法正常退出。
修复步骤:
- 在
connectWithConnector中同时返回Knex实例和Connector实例,方便后续统一释放资源 - 在销毁Knex连接后,调用Connector的
close()方法释放它占用的底层资源
修改后的代码如下:
const Knex = require('knex'); const { Connector } = require('@google-cloud/cloud-sql-connector'); const connectWithConnector = async () => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: "my-instance-connection-name", ipType: 'PUBLIC', }); const dbConfig = { client: 'pg', connection: { ...clientOpts, user: 'my-user', password: 'my-user-password', database: 'my-database', } }; return { knex: Knex(dbConfig), connector }; }; const useDatabase = async () => { let connector; try { const { knex, connector: conn } = await connectWithConnector(); connector = conn; // 这里可以添加你的数据库操作逻辑 console.log('准备销毁连接'); await knex.destroy(); console.log('Knex连接已销毁'); } catch (error) { console.error('Error:', error); } finally { // 确保Connector一定会被关闭,即使中间出错 if (connector) { await connector.close(); console.log('Connector已关闭'); } } }; useDatabase();
关键说明:
- 通过返回包含Knex和Connector的对象,确保我们能追踪到Connector实例并执行关闭操作
- 使用
finally块保证无论流程是否出错,Connector都会被关闭,彻底避免资源泄漏 - Connector的
close()是异步方法,必须用await等待执行完成,否则进程仍可能残留资源
这样修改后,进程就能正常退出了。
内容的提问来源于stack exchange,提问作者Dewek
相关产品推荐
相关产品推荐

