【问题标题】:NestJS using Environment VariableNestJS 使用环境变量
【发布时间】:2020-03-12 06:41:03
【问题描述】:

我在director的根目录中有我的环境变量和以下配置文件作为模块导入。

/config/config.service.ts

// NPM Packages
import * as dotenv from 'dotenv';
import * as fs from 'fs';
import * as Joi from '@hapi/joi';

export type EnvConfig = Record<string, string>;

export class ConfigService {
  private readonly envConfig: EnvConfig;

  constructor(filePath: string) {
    const config = dotenv.parse(fs.readFileSync(filePath));
    this.envConfig = this.validateInput(config);
  }

  /**
   * Ensures all needed variables are set,
   * and returns the validated JavaScript object
   * including the applied default values.
   */
  private validateInput(envConfig: EnvConfig): EnvConfig {
    const envVarsSchema: Joi.ObjectSchema = Joi.object({
      NODE_ENV: Joi.string()
        .valid('development', 'production', 'test', 'provision')
        .default('development'),
      PORT: Joi.number().default(3000),
      MONGO_URI: Joi.required(),
      API_AUTH_ENABLED: Joi.boolean().required(),
      IS_AUTH_ENABLED: Joi.boolean().required(),
      JWT_SECRET: Joi.required(),
      JWT_EXPIRE: Joi.required(),
      JWT_COOKIE_EXPIRE: Joi.required(),
    });

    const { error, value: validatedEnvConfig } = envVarsSchema.validate(
      envConfig,
    );
    if (error) {
      throw new Error(`Config validation error: ${error.message}`);
    }
    return validatedEnvConfig;
  }

  get(key: string): string {
    return this.envConfig[key];
  }
}

/config/config.module.ts

// Core Packages
import { Module } from '@nestjs/common';

// Custom Packages
import { ConfigService } from './config.service';

@Module({
  providers: [
    {
      provide: ConfigService,
      useValue: new ConfigService(
        `${process.env.NODE_ENV || 'development'}.env`,
      ),
    },
  ],
  exports: [ConfigService],
})
export class ConfigModule {}

我已经在 app.modules 中全局导入如下

@Module({
  imports: [ConfigModule]
})

在我的数据库提供程序 src/database/database.providers.ts 我尝试导入 MONGO_URL 变量,但出现错误。

// NPM Packages
import * as mongoose from 'mongoose';

// Custom Packages
import { envConfig } from '../config/config.service';

const mongoUrl: string = envConfig.get('MONGO_URI');

export const databaseProviders = [
  {
    provide: 'DATABASE_CONNECTION',
    useFactory: async (): Promise<typeof mongoose> =>
      await mongoose.connect(mongoUrl, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useCreateIndex: true,
        useFindAndModify: false,
      }),
  },
];

错误:

类型“typeof ConfigService”.ts(2339) 上不存在属性“get”

【问题讨论】:

  • 错误信息是什么?
  • @SafiNettah 属性 'get' 在类型 'typeof ConfigService'.ts(2339) 上不存在
  • 声明你的get 喜欢static get
  • @SafiNettah 没有帮助。我对如何将配置导入数据库提供程序文件感到困惑。然后调用钥匙

标签: node.js typescript environment-variables nestjs


【解决方案1】:

这里,你导入的是ConfigService类,不是ConfigService的实例,所以ConfigService类上没有static get方法,只是一个实例方法。您可以做的是将您的 databaseProvider 修改为如下所示:

export const databaseProviders = [
  {
    provide: 'DATABASE_CONNECTION',
    useFactory: async (private readonly configService: ConfigService): Promise<typeof mongoose> =>
      await mongoose.connect(configSerivce.get('MONGO_URI'), {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useCreateIndex: true,
        useFindAndModify: false,
      }),
    inject: [ConfigService],
    imports: [ConfigModule]
  },
];

【讨论】:

  • 能否请您向我解释一下注入和导入部分。我很困惑为什么它添加在那里
  • 当我尝试上面的代码时得到A parameter property is only allowed in a constructor implementation.ts(2369)
  • Property 'get' does not exist on type 'typeof ConfigService'. 错误
  • 我会修改你的 git repo 并在那里制作更多的 cmets。我使用了ConfigService,因为那是您拥有的课程,而ConfigModule 是出于对您称呼它的猜测。一旦我让它工作,我们可以讨论更多关于为什么
猜你喜欢
  • 2019-09-29
  • 2020-08-09
  • 2022-01-07
  • 2021-08-01
  • 2021-11-03
  • 2021-05-08
  • 2019-01-30
  • 2020-08-09
  • 2020-03-23
相关资源
最近更新 更多