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
相关产品推荐
相关产品推荐

