node.js - NestJS bruker miljøvariabel


Jeg har mitt miljøvariabel i roten av katalogen og de følgende konfigurasjonsfilene å importere som en modul.

/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 {}

Jeg har importert det globalt i app.modules som følger

@Module({
  imports: [ConfigModule]
})

I min databaseleverandør src/database/database.providers.ts prøver jeg å importere MONGO_URL-variabelen, men får en feil.

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

Feil :

Egenskapen 'get' eksisterer ikke på typen 'typeof ConfigService'.ts(2339)

Svar #1

Her importerer du ConfigService-klassen, ikke en forekomst av ConfigService, så det finnes ingen static get-metode på ConfigService-klassen, bare en instansmetode. Det du kan gjøre i stedet er å endre databaseProvider til å se slik ut:

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