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

Jest集成测试中Knex报错无法获取数据库连接,Sequelize运行正常

解决方案

1. 对齐Knex与Sequelize的SSL动态配置

本地PostgreSQL默认未开启SSL支持,你之前的Knex配置要么完全没加SSL逻辑,要么写死强制启用SSL,和Sequelize的动态判断逻辑不一致,是最常见的报错诱因。修改Knex配置和Sequelize保持SSL规则一致:

const knexConfig = {
  client: 'pg',
  connection: config.sslDB === 'true' 
    ? {
        connectionString: config.dbConString,
        ssl: {
          require: true,
          rejectUnauthorized: false
        }
      }
    : config.dbConString,
  pool: {
    min: 0,
    max: process.env.NODE_ENV === 'test' ? 3 : 15, // 测试环境缩小连接池上限
    idleTimeoutMillis: 1000, // 测试环境快速回收空闲连接
    acquireTimeoutMillis: 30000 // 延长获取连接的超时时间
  }
};

2. 测试生命周期中主动管理Knex连接

Jest运行测试时会频繁加载/卸载模块,若每次测试都重新初始化Knex实例,很容易出现连接残留占满数据库连接池的问题,做两处调整:

  • 全局或单个测试文件的afterAll钩子中主动销毁Knex连接:
afterAll(async () => {
  await _knex.destroy();
  // 同时销毁Sequelize连接避免残留
  await _sqlz.close();
});
  • 把Knex、Sequelize实例封装为全局单例,避免重复初始化:
// db.ts 全局导出唯一实例
let knexInstance: Knex | null = null;
export const getKnex = () => {
  if (!knexInstance) {
    knexInstance = knex(knexConfig);
  }
  return knexInstance;
}

3. 调整Jest配置避免PG模块被转译

如果使用ts-jest,PG的原生模块被转译后会出现运行异常,在jest.config.js中添加PG模块的忽略规则:

module.exports = {
  // 其他配置
  transformIgnorePatterns: [
    'node_modules/(?!pg/)'
  ]
}

如果开启了Jest多并发测试,可调低并发数减少连接占用:运行jest时添加参数jest --maxWorkers=2

4. 配置校验

初始化Knex前添加调试日志,确认测试环境下加载的数据库连接字符串、SSL配置和开发环境完全一致,避免配置加载逻辑出错导致参数异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:09:03