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