Bird
Raised Fist0
NestJSframework~10 mins

Environment variables in NestJS - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Environment variables
Start Application
↓
Load .env file
↓
Parse variables
↓
Set process.env variables
↓
Access variables in code
↓
Use variables for config
↓
Application runs with config
The app starts by loading a .env file, parsing its variables, setting them in process.env, then accessing them in code for configuration.
Execution Sample
NestJS
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [ConfigModule.forRoot()],
})
export class AppModule {}
This code loads environment variables from a .env file into process.env when the app starts.
Execution Table
StepActionprocess.env stateResult
1Application starts{}No env vars loaded yet
2ConfigModule.forRoot() loads .env{"PORT":"3000","DB_HOST":"localhost"}Env vars parsed and set
3Access process.env.PORT{"PORT":"3000","DB_HOST":"localhost"}Returns '3000'
4Access process.env.DB_HOST{"PORT":"3000","DB_HOST":"localhost"}Returns 'localhost'
5Use env vars in config{"PORT":"3000","DB_HOST":"localhost"}App configures server and DB connection
6Application runs{"PORT":"3000","DB_HOST":"localhost"}App uses env vars for behavior
💡 All environment variables loaded and used; app runs with config from .env
Variable Tracker
VariableStartAfter Step 2After Step 6
process.env{}{"PORT":"3000","DB_HOST":"localhost"}{"PORT":"3000","DB_HOST":"localhost"}
Key Moments - 3 Insights
Why do we not see environment variables before ConfigModule.forRoot() runs?
Because process.env is empty initially (see Step 1 in execution_table). The ConfigModule loads and sets variables at Step 2.
How do we access environment variables in NestJS code?
We use process.env.VARIABLE_NAME after ConfigModule.forRoot() has loaded them, as shown in Steps 3 and 4.
What happens if a variable is missing in the .env file?
It won't be set in process.env, so accessing it returns undefined. You should provide defaults or validation.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of process.env after Step 2?
A{"PORT":"3000","DB_HOST":"localhost"}
B{}
C{"PORT":"undefined","DB_HOST":"localhost"}
Dnull
💡 Hint
Check the 'process.env state' column at Step 2 in the execution_table.
At which step does the application start using environment variables for configuration?
AStep 1
BStep 3
CStep 5
DStep 6
💡 Hint
Look for when the app uses env vars for config in the 'Result' column.
If the .env file did not have DB_HOST, what would process.env.DB_HOST be after Step 2?
A"localhost"
Bundefined
C"" (empty string)
Dnull
💡 Hint
Variables not in .env are not set in process.env, see key_moments about missing variables.
Concept Snapshot
NestJS loads environment variables from a .env file using ConfigModule.forRoot().
These variables become available in process.env.
Access them in your code via process.env.VARIABLE_NAME.
Missing variables return undefined.
Use env vars to configure app behavior without hardcoding.
Full Transcript
When a NestJS application starts, it uses ConfigModule.forRoot() to load environment variables from a .env file. This process reads the file, parses key-value pairs, and sets them in the Node.js process.env object. Before loading, process.env is empty for these variables. After loading, variables like PORT and DB_HOST are accessible anywhere in the app via process.env.PORT or process.env.DB_HOST. These values configure the app's behavior, such as which port to listen on or database connection details. If a variable is missing in the .env file, accessing it returns undefined, so defaults or validation are recommended. This approach keeps configuration separate from code, making apps flexible and secure.

Practice

(1/5)
1. What is the main purpose of using environment variables in a NestJS application?
easy
A. To hardcode sensitive data like passwords in the source code
B. To write all configuration directly inside the main application file
C. To make the application run faster by avoiding configuration files
D. To keep configuration settings outside the code for security and flexibility

Solution

  1. Step 1: Understand environment variables purpose

    Environment variables store settings like API keys or database URLs outside the code to keep them safe and easy to change.
  2. Step 2: Compare options

    Only To keep configuration settings outside the code for security and flexibility correctly describes this purpose. Options A and B suggest unsafe practices, and D is incorrect about performance.
  3. Final Answer:

    To keep configuration settings outside the code for security and flexibility -> Option D
  4. Quick Check:

    Environment variables = external safe config [OK]
Hint: Environment variables keep secrets out of code [OK]
Common Mistakes:
  • Hardcoding sensitive data inside source code
  • Confusing environment variables with regular variables
  • Thinking environment variables improve speed
2. Which of the following is the correct way to load environment variables in a NestJS app?
easy
A. Manually read .env file using fs module in every service
B. Use process.env directly without any module
C. Import ConfigModule with ConfigModule.forRoot() in the root module
D. Declare environment variables inside main.ts without ConfigModule

Solution

  1. Step 1: Identify NestJS recommended method

    NestJS uses ConfigModule.forRoot() to load .env files and provide ConfigService.
  2. Step 2: Evaluate other options

    Options A and C are possible but not recommended patterns. Declare environment variables inside main.ts without ConfigModule is incorrect because environment variables are external.
  3. Final Answer:

    Import ConfigModule with ConfigModule.forRoot() in the root module -> Option C
  4. Quick Check:

    ConfigModule.forRoot() loads env [OK]
Hint: Use ConfigModule.forRoot() to load .env [OK]
Common Mistakes:
  • Reading .env manually everywhere
  • Ignoring ConfigModule and using process.env directly
  • Declaring env variables inside code files
3. Given this code snippet in a NestJS service:
constructor(private configService: ConfigService) {}

getDbHost() {
  return this.configService.get('DATABASE_HOST');
}

If the .env file contains DATABASE_HOST=localhost, what will getDbHost() return?
medium
A. undefined
B. localhost
C. DATABASE_HOST
D. null

Solution

  1. Step 1: Understand ConfigService.get() behavior

    ConfigService.get('DATABASE_HOST') reads the value of DATABASE_HOST from loaded environment variables.
  2. Step 2: Match with .env content

    The .env file sets DATABASE_HOST=localhost, so the method returns 'localhost'.
  3. Final Answer:

    localhost -> Option B
  4. Quick Check:

    ConfigService.get('DATABASE_HOST') = 'localhost' [OK]
Hint: ConfigService.get returns env value by key [OK]
Common Mistakes:
  • Expecting the key name instead of value
  • Assuming undefined if ConfigModule not imported
  • Confusing null with undefined
4. What is wrong with this NestJS module setup for environment variables?
@Module({
  imports: [ConfigModule],
})
export class AppModule {}
medium
A. ConfigModule is imported without calling forRoot(), so env variables won't load
B. ConfigModule should be imported in providers, not imports
C. ConfigModule requires a .json config file, not .env
D. ConfigModule must be imported twice to work

Solution

  1. Step 1: Check ConfigModule import syntax

    ConfigModule must be imported with forRoot() to load environment variables from .env file.
  2. Step 2: Identify error in code

    The code imports ConfigModule directly without forRoot(), so env variables won't be loaded.
  3. Final Answer:

    ConfigModule is imported without calling forRoot(), so env variables won't load -> Option A
  4. Quick Check:

    ConfigModule.forRoot() needed to load env [OK]
Hint: Always use ConfigModule.forRoot() to load env [OK]
Common Mistakes:
  • Importing ConfigModule without forRoot()
  • Placing ConfigModule in providers instead of imports
  • Thinking ConfigModule needs JSON config
5. You want to provide a default value for an environment variable PORT in NestJS if it is not set in the .env file. Which code snippet correctly achieves this in a service?
hard
A. const port = this.configService.get('PORT') || 3000;
B. const port = process.env.PORT ? 3000 : this.configService.get('PORT');
C. const port = this.configService.get('PORT', 3000);
D. const port = this.configService.get('PORT') && 3000;

Solution

  1. Step 1: Understand default value logic

    If PORT is undefined or empty, use 3000 as default. Logical OR (||) works for this.
  2. Step 2: Analyze options

    const port = this.configService.get('PORT') || 3000; uses || to provide default 3000 if get('PORT') is falsy. const port = process.env.PORT ? 3000 : this.configService.get('PORT'); reverses logic incorrectly. const port = this.configService.get('PORT', 3000); is invalid because get() does not take default param. const port = this.configService.get('PORT') && 3000; uses && which returns 3000 only if PORT is truthy, wrong logic.
  3. Final Answer:

    const port = this.configService.get('PORT') || 3000; -> Option A
  4. Quick Check:

    Use || to set default value [OK]
Hint: Use || to set default if env variable missing [OK]
Common Mistakes:
  • Using && instead of || for default
  • Passing default value as second argument to get()
  • Reversing condition logic
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard