无法使用 Typeorm 连接 NestJS 中的 mysql 数据库 - 错误:this.mysql.createPool 不是函数

问题描述 投票:0回答:1

目前,我开始学习Nestjs并执行一些增删改查操作,但在开始之前,我陷入了数据库连接问题。

此外,我的场景与普通数据库连接不同。我将从 Azure 密钥保管库获取数据库凭据,然后将凭据放入 app.module.ts 中。

但是,每次都会显示

this.mysql.createPool is not a function
错误消息。我不知道为什么。

另外,您可以参考下面的截图。

另外,我在下面放了一些代码供您理解。

azureKeyVault.service.ts

import { KeyVaultSecret, SecretClient } from '@azure/keyvault-secrets';
import { DefaultAzureCredential } from '@azure/identity';
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { Injectable } from '@nestjs/common';

interface credential {
  username: string;
  password: string;
}

export interface dbConfig {
  type: string;
  host: string;
  port: number;
  username: string;
  password: string;
  database: string;
  entities: [string];
  synchronize: boolean;
  autoLoadEntities: boolean;
  retryAttempts: number;
}

@Injectable()
class AzureKeyVaultService {
  /**
   * Azure key vault service
   */
  public async azureKeyVault() {
    const keyVaultEndpoint = 
`https://${process.env.AZURE_KV_ENDPOINT}.vault.azure.net`;

    /* Fetch Default Azure Credential */
    const credential: DefaultAzureCredential = new DefaultAzureCredential();

    // /* Create server client using endpoint and credential */
    const client: SecretClient = new SecretClient(keyVaultEndpoint, credential);
    return await client.getSecret(process.env.AZURE_KV_NAME);
  }

  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  // @ts-ignore
  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: 'MysqlDriver',
      host: dbCredentialData?.masterhost,
      port: 3306,
      username: 'development',
      password: password,
      database: process.env.DB_MAIN,
      entities: [__dirname + '/../**/*.entity.js'],
      synchronize: false,
      autoLoadEntities: true,
      retryAttempts: 1,
    };
  }
}

const AzureKeyVault = new AzureKeyVaultService();
export { AzureKeyVault };

app.module.ts

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 { AzureKeyVault } from './config/azureKeyVault.service';

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: '.env',
    }),
    // TypeOrmModule.forRoot(AzureKeyVault.databaseConfiguration()),
    TypeOrmModule.forRootAsync({
      useFactory: async () => AzureKeyVault.databaseConfiguration(),
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

文件夹结构:

如果有人知道是什么问题请回复。

谢谢你。

javascript mysql node.js nestjs typeorm
1个回答
0
投票

经过对这个问题的多次搜索。我发现没有什么大问题。只需要删除 azureKeyVault.service.ts 文件中的一个额外参数

driver

最终返回对象如下。

return {
  type: 'mysql',
  host: dbCredentialData?.masterhost,
  port: 3306,
  username: 'development',
  password: password,
  database: process.env.DB_MAIN,
  entities: [__dirname + '/../**/*.entity.js'],
  synchronize: false,
  autoLoadEntities: true,
  retryAttempts: 1,
};
© www.soinside.com 2019 - 2024. All rights reserved.