目前,我开始学习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 {}
文件夹结构:
如果有人知道是什么问题请回复。
谢谢你。
经过对这个问题的多次搜索。我发现没有什么大问题。只需要删除 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,
};