การตั้งค่าใช้งาน MongoDB ใน NestJS ง่าย ๆ

Oct. 29, 2024 · boychawin

มาดูวิธีการตั้งค่าการทำงาน 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