Skip to content

A. Global Configuration

Kita akan membahas dotenv, dimana file ini digunakan untuk memyimpan konfigurasi pada aplikasi kita. Kalau sebelum nya konfigurasi kita tulis secara hardcode pada koding seperti pada saat membuat konfig typeorm

typeorm.config.ts

import { TypeOrmModuleOptions } from "@nestjs/typeorm";
export const typeOrmConfig: TypeOrmModuleOptions = {
  type: "mysql",
  host: "localhost",
  port: 3307, //port default 3306 lihat xampp
  username: "root", // username default xampp root
  password: "root", // password default xampp string kosong
  database: "belajar_nest_js",
  entities: ["dist/**/*.entity{.ts,.js}"],
  synchronize: true,
};

cara di atas sangatlah tidak direkomentasikan diterapkan pada project karena konfigurasi dari database kita simpan di kodingan sehingga kurang aman dan kurang fleksibel. Solusi dari masalah ini kita bisa menggunakan file .env

1. Instalasi Packege Config

Pertama kita instalasi dulu package untuk config

npm i --save @nestjs/config

2. Import Module Config pada app module

kita import pada app module sebagai global agar bisa diakses oleh semua module

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { typeOrmConfig } from './config/typeorm.config';
import { AuthModule } from './app/auth/auth.module';
import { MailModule } from './app/mail/mail.module';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,  // konfigurasi is global untuk semua module
    }),
    TypeOrmModule.forRoot(typeOrmConfig),
    AuthModule,
    MailModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

3. Buat File .env

buatlah file .env

Alt text

DB_HOST = localhost
DB_USERNAME = root
DB_PASSWORD = root
DB_DATABASE = belajar_nest_js
DB_PORT = 3307


//JWT

JWT_SECRET = belajar_jwt
JWT_EXPIRED = 3600


//MAIL

MAIL_HOST = sandbox.smtp.mailtrap.io
MAIL_PORT = 2525
MAIL_USER = 116b44e4fce785
MAIL_PASS = 0a66404e****** // sesuaikan dengan mail password

BASE_CLIENT_URL = http://localhost:5002

4. Implentasi

Setelah kita membuat dotenv, selanjutnya kita akan lakuka penyesuai pada file-file barikut.

jwt.config.ts

export const jwt_config = {
  secret: process.env.JWT_SECRET,
  expired: process.env.JWT_EXPIRED,
};
typeorm.config.ts

import { TypeOrmModuleOptions } from '@nestjs/typeorm';
export const typeOrmConfig: TypeOrmModuleOptions = {
  type: 'mysql',
  host: process.env.DB_HOST,
  port: Number(process.env.DB_PORT), //port default 3306 lihat xampp
  username: process.env.DB_USERNAME, // username default xampp root
  password: process.env.DB_PASSWORD, // password default xampp string kosong
  database: process.env.DB_DATABASE,
  entities: ['dist/**/*.entity{.ts,.js}'],
  synchronize: true,
};

mail.module.ts

import { MailerModule } from '@nestjs-modules/mailer';
import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter';
import { Module } from '@nestjs/common';
import { MailService } from './mail.service';
import { join } from 'path';

@Module({
  imports: [
    MailerModule.forRoot({
      transport: {
        host: process.env.MAIL_HOST,
        port: Number(process.env.MAIL_PORT),
        auth: {
          user: process.env.MAIL_USER,
          pass: process.env.MAIL_PASS,
        },
      },
      defaults: {
        from: '"No Reply" <noreply@example.com>',
      },
      template: {
        dir: join(__dirname, 'templates'),
        adapter: new HandlebarsAdapter(),
        options: {
          strict: true,
        },
      },
    }),
  ],
  providers: [MailService],
  exports: [MailService], // 👈 export for DI
})
export class MailModule {}

auth.service.ts

async forgotPassword(email: string): Promise<ResponseSuccess> {
    const user = await this.authRepository.findOne({
      where: {
        email: email,
      },
    });

    if (!user) {
      throw new HttpException(
        'Email tidak ditemukan',
        HttpStatus.UNPROCESSABLE_ENTITY,
      );
    }
    const token = randomBytes(32).toString('hex');
    const link = `${process.env.BASE_CLIENT_URL}/auth/reset-password/${user.id}/${token}`; // sesuaikan client url
    await this.mailService.sendForgotPassword({
      email: email,
      name: user.nama,
      link: link,
    });

    const payload = {
      user: {
        id: user.id,
      },
      token: token,
    };

    await this.resetPasswordRepository.save(payload);

    return this._success('Silahkan Cek Email');
  }