มาดูวิธีการตั้งค่าการทำงาน MongoDB ใน NestJS โดยใช้ .env เพื่อตั้งค่าการเชื่อมต่อกับฐานข้อมูล กันครับ บทความ MongoDB
1. สร้างและตั้งค่า .env
เริ่มจากสร้างไฟล์ .env ใน root ของโปรเจกต์ และกำหนดค่าเชื่อมต่อ MongoDB เช่น
DB_URL=mongodb://localhost:27035/
DB_NAME=my-app
MONGO_SECRET_KEY="mongoSecretKey"
MONGO_SALT_GENERATOR="xxx"
MONGO_ENCRYPTED_DATA_KEY="xxxx"
2. ตั้งค่า Config Module สำหรับดึงค่าตัวแปร
ใช้ ConfigModule ของ NestJS เพื่อโหลดค่าจาก .env ไปใช้งาน โดยสร้างไฟล์ database.config.ts ในโฟลเดอร์ที่จัดเก็บการตั้งค่าของระบบ เราจะกำหนด interface เพื่อบอกโครงสร้างของข้อมูลที่ใช้ในระบบ และฟังก์ชัน registerAs เพื่อดึงค่าจาก .env
// database.config.ts
import { ConfigService, registerAs } from '@nestjs/config';
export interface IDatabaseConfig {
uri: string;
secretKey: string;
saltGenerator: string;
encryptedDataKey: string;
}
export default registerAs(
'database',
(): IDatabaseConfig => {
const configService = new ConfigService();
return {
uri: `${configService.get('DB_URL')}${configService.get('DB_NAME')}`,
secretKey: configService.get('MONGO_SECRET_KEY'),
saltGenerator: configService.get('MONGO_SALT_GENERATOR'),
encryptedDataKey: configService.get('MONGO_ENCRYPTED_DATA_KEY'),
};
},
);
3. ตั้งค่า Mongoose Module ให้ใช้ Config Module
เราจะสร้าง MongoModule ขึ้นมาแยกต่างหากสำหรับจัดการ MongoDB ในโมดูลนี้จะใช้ MongooseModule.forRootAsync() เพื่อตั้งค่าการเชื่อมต่อแบบ asynchronous โดยดึงค่า uri จาก ConfigService
// mongo.module.ts
import { Logger, Module, OnApplicationShutdown } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { InjectConnection, MongooseModule } from '@nestjs/mongoose';
import { Connection } from 'mongoose';
@Module({
imports: [
MongooseModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => {
const databaseUri = configService.get<string>('database.uri');
console.log("Database URI:", databaseUri);
return {
uri: databaseUri,
connectionFactory: (connection: Connection) => {
const logger = new Logger('MongoDB Connection');
if (connection.readyState === 1) {
logger.log('Connected to MongoDB successfully!');
}
connection.on('disconnected', () => {
logger.log('MongoDB disconnected');
});
return connection;
},
};
},
}),
],
})
export class MongoModule implements OnApplicationShutdown {
constructor(@InjectConnection() private readonly connection: Connection) {}
async onApplicationShutdown() {
if (this.connection) {
await this.connection.close();
}
}
}
4. เพิ่ม Config Module และ Mongo Module ใน App Module
ใน AppModule ให้เพิ่มทั้ง ConfigModule และ MongoModule เข้าไป
// app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import databaseConfig from './shared/mongo/database.config';
import { MongoModule } from './shared/mongo/mongo.module';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [databaseConfig],
}),
MongoModule,
// โมดูลอื่น ๆ...
],
})
export class AppModule {}
สรุป
การตั้งค่าตัวแปรสภาพแวดล้อม .env ใน NestJS ให้ทำงานร่วมกับ MongoDB สามารถทำได้ง่าย ๆ โดยใช้ ConfigModule โหลดค่าตัวแปรและดึงไปใช้ใน MongoModule การใช้ ConfigService ร่วมกับ forRootAsync ช่วยให้จัดการการเชื่อมต่อกับ MongoDB