NestJS+TypeORM连接MySQL报错:this.mysql.createPool is not a function
解决NestJS从Azure Key Vault取凭证连接MySQL时报错
this.mysql.createPool is not a function 问题原因分析
- 错误配置
driver字段:TypeOrmModuleOptions中的driver需要传入具体的驱动类,而非字符串'MysqlDriver';且当type设为'mysql'时,TypeORM会自动加载对应驱动,无需手动指定driver,错误的字符串配置导致TypeORM无法正确初始化MySQL连接池。 - 可能缺失
mysql2依赖:TypeORM连接MySQL必须依赖mysql2包,若未安装会因找不到核心方法报错。 - 硬编码用户名问题:当前代码中
username写死为'development',未使用从Azure Key Vault获取的真实凭证,可能导致后续连接失败。
解决方案步骤
1. 修正TypeORM配置
修改azureKeyVault.service.ts中的databaseConfiguration方法,移除错误的driver配置,并替换硬编码的用户名:
public async databaseConfiguration(): TypeOrmModuleOptions { const { value }: KeyVaultSecret = await this.azureKeyVault(); const dbCredentialData = JSON.parse(value); console.log('dbCredentialData', dbCredentialData); const { username, password }: credential = dbCredentialData[process.env.AZURE_KV_KEY]; return { type: 'mysql', // 移除错误的driver配置 host: dbCredentialData?.masterhost, port: 3306, username: username, // 使用从KV获取的真实用户名 password: password, database: process.env.DB_MAIN, entities: [__dirname + '/../**/*.entity.js'], synchronize: false, autoLoadEntities: true, retryAttempts: 1, }; }
2. 安装必要依赖
执行命令安装MySQL驱动依赖:
npm install mysql2 --save
3. 优化服务实例化方式(可选但推荐)
当前手动实例化AzureKeyVaultService不符合NestJS依赖注入规范,改为通过DI容器管理:
- 修改
azureKeyVault.service.ts,移除手动实例化代码,直接导出类:
// 移除以下代码 // const AzureKeyVault = new AzureKeyVaultService(); // export { AzureKeyVault }; // 导出类 export class AzureKeyVaultService { // 原有方法保持不变 }
- 在
app.module.ts中注册为Provider并使用:
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AzureKeyVaultService } from './config/azureKeyVault.service'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: '.env', }), TypeOrmModule.forRootAsync({ useClass: AzureKeyVaultService, }), ], controllers: [AppController], providers: [AppService, AzureKeyVaultService], }) export class AppModule {}
4. 验证凭证正确性
通过控制台输出的dbCredentialData日志,确认从Azure Key Vault获取的masterhost、username、password值正确有效。
内容的提问来源于stack exchange,提问作者Sujal Patel
相关产品推荐
相关产品推荐

