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

使用Knex与Google Cloud SQL Connector的Node.js进程无法退出

解决Knex连接Cloud SQL后进程无法退出的问题

你的问题出在没有关闭Cloud SQL Connector实例——Knex的destroy()只会关闭数据库连接池,但Connector本身维护的TCP代理连接还在占用资源,导致进程无法正常退出。

修复步骤:

  1. 在connectWithConnector中同时返回Knex实例和Connector实例,方便后续统一释放资源
  2. 在销毁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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:52:06