📖 Scenario: You are building a simple NestJS application that needs to use environment variables to configure its behavior. Environment variables help keep sensitive data like API keys or configuration settings outside your code.
🎯 Goal: Learn how to set up environment variables in a NestJS project and access them inside a service.
📋 What You'll Learn
Create a .env file with specific variables
Configure the ConfigModule to load environment variables
Inject ConfigService to read environment variables
Use environment variables inside a service method
💡 Why This Matters
🌍 Real World
Environment variables keep sensitive data and configuration outside code, making apps safer and easier to configure for different environments like development and production.
💼 Career
Knowing how to use environment variables is essential for backend developers working with NestJS or any server-side framework to manage configuration securely and flexibly.
Progress0 / 4 steps
1
Create a .env file with variables
Create a file named .env in the root folder with these exact lines: API_KEY=12345 PORT=3000
NestJS
Hint
The .env file should be plain text with key=value pairs, no quotes.
2
Configure ConfigModule to load .env
In app.module.ts, import ConfigModule from @nestjs/config and add ConfigModule.forRoot() to the imports array inside @Module.
Create a service named AppService with a constructor that injects ConfigService from @nestjs/config. Store it in a private readonly variable called configService.
NestJS
Hint
Use dependency injection to get ConfigService instance.
4
Use environment variables inside a method
Add a method getApiKey() inside AppService that returns the value of the environment variable API_KEY using this.configService.get('API_KEY').
NestJS
Hint
Use ConfigService's get method to read environment variables.
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
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.
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.
Final Answer:
To keep configuration settings outside the code for security and flexibility -> Option D
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
Step 1: Identify NestJS recommended method
NestJS uses ConfigModule.forRoot() to load .env files and provide ConfigService.
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.
Final Answer:
Import ConfigModule with ConfigModule.forRoot() in the root module -> Option C
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
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
Step 1: Check ConfigModule import syntax
ConfigModule must be imported with forRoot() to load environment variables from .env file.
Step 2: Identify error in code
The code imports ConfigModule directly without forRoot(), so env variables won't be loaded.
Final Answer:
ConfigModule is imported without calling forRoot(), so env variables won't load -> Option A
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
Step 1: Understand default value logic
If PORT is undefined or empty, use 3000 as default. Logical OR (||) works for this.
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.
Final Answer:
const port = this.configService.get('PORT') || 3000; -> Option A
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 unknownstrongwhile earning +1 Grip toward your certificate.