nestjs - 如何在 Nestjs DatabaseModule 中使用 ConfigService
问题描述
我使用nestjs typeorm创建了一个 DatabaseModule
import { createConnection } from 'typeorm';
import { ConfigService } from '@nestjs/config';
export const databaseConnection = [
{
provide: 'DATABASE_CONNECTION',
useFactory: async (configService: ConfigService) => await createConnection({
type: configService.get('DBTYPE'),
host: configService.get('DBHOST'),
port: configService.get('DBPORT'),
username: configService.get('DBUSERNAME'),
password: configService.get('DBPASSWORD'),
database: configService.get('DBNAME'),
synchronize: true,
entities: [
__dirname + '/../**/*.entity.ts'
]
})
}
];
在启动其余服务时,我收到以下错误
Cannot read property 'get' of undefined - {"stack":["TypeError: Cannot read property 'get' of undefined
at InstanceWrapper.useFactory [as metatype] (../database/database.provider.js:9:33)
at Injector.instantiateClass (../node_modules/@nestjs/core/injector/injector.js:293:55)
at callback (../node_modules/@nestjs/core/injector/injector.js:77:41)
at process._tickCallback (internal/process/next_tick.js:68:7)
at Function.Module.runMain (internal/modules/cjs/loader.js:834:11)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)"]}
我已经导入了ConfigModule
里面DatabaseModule
。
有人可以帮我解决这个问题吗?
编辑
我的数据库配置
import { registerAs } from '@nestjs/config';
// Configuration factory class for database configuration.
const DatabaseConfig = registerAs('DBConfig', () => ({
DBTYPE: process.env.DATABASE_TYPE,
DBHOST: process.env.DATABASE_HOST || 'localhost',
DBPORT: process.env.DATABASE_PORT || 5432,
DBUSERNAME: process.env.DATABASE_USERNAME,
DBPASSWORD: process.env.DATABASE_PASSWORD,
DBNAME: process.env.DATABASE_NAME
}));
在 app.module.ts 导入
ConfigModule.forRoot({
isGlobal: true,
expandVariables: true,
load: [AppConfig, DatabaseConfig]
}),
解决方案
如果ConfigService
来自全局模块,则需要添加inject
到异步配置中,如下所示:
由于您使用的是 config.namespace,因此您可以像调用它一样调用它DBConfig.DBTYPE
。
export const databaseConnection = [
{
provide: 'DATABASE_CONNECTION',
inject: [ConfigService],
useFactory: async (configService: ConfigService) => await createConnection({
type: configService.get('DBConfig.DBTYPE'),
host: configService.get('DBConfig.DBHOST'),
port: configService.get('DBConfig.DBPORT'),
username: configService.get('DBConfig.DBUSERNAME'),
password: configService.get('DBConfig.DBPASSWORD'),
database: configService.get('DBConfig.DBNAME'),
synchronize: true,
entities: [
__dirname + '/../**/*.entity.ts'
]
})
}
];
如果ConfigService
不是来自全局模块,则需要同时添加 inject: [ConfigService]
和imports: [ConfigModule]
。
推荐阅读
- r - R - 在每行中创建具有不同计算的新列
- java - Java构造函数多次调用?
- android - 按时间戳升序对 X 个最近的 Firestore 文档进行排序,并实时添加
- python - 在文本数组中查找年份的索引
- azure-devops - 如何在构建管道中启用部署到 Visual Studio 应用中心任务?
- java - 调用不同版本的 SOAP API(无代码重复)
- python - 为 Keras 制作自定义损失函数
- sas - PROC PRINT 和 PROC MEANS
- ms-access - 当有多个最大值时,选择最大值在 VBA 中返回什么?
- c - 读取变量时出错,无法访问内存