NestJS+TypeORM测试时出现'geography类型不存在'错误排查
解决NestJS测试模块中TypeORM geography列报错问题
问题核心
在测试模块中启用dropSchema: true时,TypeORM自动安装PostGIS的逻辑滞后于schema同步操作,导致创建包含geography类型的表时抛出QueryFailedError: type "geography" does not exist错误。而生产/开发环境因数据库未被频繁重建,PostGIS已提前存在,所以运行正常。
解决方案
1. 在数据源初始化前手动安装PostGIS
通过临时连接数据库,先执行扩展安装操作,再初始化正式数据源,确保schema同步前PostGIS已就绪:
export const testingModule = (providers: Provider[]) => { return Test.createTestingModule({ imports: [ TypeOrmModule.forRootAsync({ useFactory: () => ({ type: 'postgres', url: getEnv('DATABASE_URL'), dropSchema: true, autoLoadEntities: true, synchronize: true, logging: false, namingStrategy: new SnakeNamingStrategy(), keepConnectionAlive: false, }), dataSourceFactory: async (options: DataSourceOptions) => { // 创建临时连接用于安装PostGIS const tempDataSource = new DataSource({ ...options, entities: [], // 无需加载实体 synchronize: false, }); await tempDataSource.initialize(); await tempDataSource.query('CREATE EXTENSION IF NOT EXISTS postgis;'); await tempDataSource.destroy(); // 初始化正式数据源 const dataSource = new DataSource(options); await dataSource.initialize(); return dataSource; }, }), TypeOrmModule.forFeature([Location]), EventEmitterModule.forRoot(), ], providers, }); };
2. 确保测试数据库用户有权限
测试用的数据库用户需要具备创建扩展的权限,若没有则执行以下SQL授权:
GRANT CREATE EXTENSION TO your_test_database_user;
3. 禁用测试环境的dropSchema(可选)
如果测试不需要每次重建整个schema,可以将dropSchema改为false,改用migrations或者手动清理数据,避免每次都需要重新安装PostGIS。
原因说明
TypeORM自动安装PostGIS的逻辑是在实体元数据解析后触发,但测试环境中dropSchema: true会先删除数据库所有对象,随后立即执行synchronize创建表,此时PostGIS尚未被安装,因此抛出类型不存在的错误。通过提前手动安装扩展,就能规避这个时序问题。
内容的提问来源于stack exchange,提问作者Kelsey
相关产品推荐
相关产品推荐

