【问题标题】:How to use ConfigService in Nestjs DatabaseModule如何在 Nestjs DatabaseModule 中使用 ConfigService
【发布时间】:2021-01-18 22:57:47
【问题描述】:

我使用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)"]}

我在DatabaseModule 中导入了ConfigModule

有人可以帮我解决这个问题吗?

编辑

我的数据库配置

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]
}),

【问题讨论】:

    标签: nestjs typeorm nestjs-config


    【解决方案1】:

    如果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 不是来自全局模块,您需要添加both inject: [ConfigService]imports: [ConfigModule]

    【讨论】:

    • 配置服务确实来自全局模块。添加inject 后,configService.get('DBTYPE') 返回undefined
    • 那么,ConfigModule 是如何注册的? .env 文件中有 DBTYPE 吗?您可以看到ConfigService 正在按预期工作
    • 我已经更新了我的问题。我在 main.ts 中调用了AppConfig,它可以工作
    • 您正在使用配置命名空间。你需要做configService.get(namespace.value)。在这种情况下configService.get('DBConfig.DBTYPE')
    猜你喜欢
    • 2020-07-23
    • 2019-03-05
    • 2022-06-17
    • 2022-07-14
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多