Sari la conținut

Postări Recomandate

Postat

In aceasta parte , vom implementa partea de conexiune cu baza de date MySQL . 

** Configuratie **

Pe de o parte , vom introduce in fisierul de configuratie '.env' , informatii si credentiale pentru efectuarea conexiuni

# .env 

## ... alte variabile 


## SETARI PRECUM HOSTUL , PORTUL , NUMELE BAZEI DE DATE + CREDENTIALE (UTILIZATOR SI PAROLA) 

HOST_DB = LOCALHOST 
PORT_DB = 3306
NAME_DB = SocialMediaDB 
USERNAME_DB = root
PASSWORD_DB = ******* 

## la parola inlocuiti acele caractere cu parola voastra

Pe de alta parte , va trebui sa exportam configuratia prin 'configData.ts' (din folderul Configuratie) , cu scopul de  a fi accesibila informatia in tot proiectul . 

// configData.ts 

/// alte informatii .... 

export const dbConfig = {  // Exportam credentialele Bazei de Date 
    host:process.env.HOST_DB,
    port:+process.env.PORT_DB!,  // +! ==> forteaza ca portul sa fie tratat CA NUMAR SI NU , SIR DE CARACTERE !!
    user:process.env.USERNAME_DB,
    password:process.env.PASSWORD_DB,
    database:process.env.NAME_DB 
}

 ** Conexiune cu Baza de date **

In primul rand , ne asiguram ca avem instalata dependenta la 'mysql' (prin CMD) 

npm i mysql2

Apoi , construim un fisier typeScript ('dbConnection.ts' --> la nivel cu 'server.ts') , construim o clasa 'DBConnection' ce gestioneaza poolul de conexiuni (de la constructie la reutilizare) . 

// dbConnection.ts

import * as mysqlConection from 'mysql2/promise'  // Importam Dependenta MySQL
import {dbConfig} from './configurations/configData' // Importam Configuratia cu Credentialele 

export class DBConnection {  // Pregatim clasa de export pentru utilizarea si reutilizarea conexiunilor
  
   // .. 
  
} 

Declaram doua proprietati : dbInstance (statica centralizata pentru a si mentine valorile) si 'databaseConnectionPool' care ne ofera , prin intermediul 'dbInstance' , accesul la baza de date . 

// dbConnection.ts

export class DBConnection {
   private static dbInstance : DBConnection  // Instanta 
   private databaseConnectionPool : mysqlConection.Pool; // Connexiunea  
  /// ..
}

Pe baza modelului 'Singleton' , va trebui sa ne facem un constructor PRIVAT (accesibil doar in clasa) pentru a preveni initializarea din exterior

// dbConnection.ts

export class DBConnection {
   // ...
  
  private constructor() // Prevenim Initializarea din Exterior   
    {
        const dbConfigCopy = { ... dbConfig} // Copiem Configuratia bazei de date 
        delete dbConfigCopy.database  // EXCLUDEM  NUMELE bazei de date 
        this.databaseConnectionPool = mysqlConection.createPool(dbConfigCopy)  // Construim o conexiune de tip Pool
        // FARA SA SPECIFICAM NUMELE BAZEI DE DATE
    }
  
   public static getInstance = () : DBConnection => {  // Accesibil din afara , ne returneaza instanta 
         if(!this.dbInstance) // Daca instanta nu e definita 
         {
             this.dbInstance = new DBConnection() // Apelam Constructorul si Initializam Baza de Date  
         }
        return this.dbInstance  // RETURNAM INSTANTA
    }
   
}

Acum , va trebui sa initializam baza de date construind-o ,  DACA NU O GASIM :

// dbConnection.ts

export class DBConnection {  // Pregatim clasa de export pentru utilizarea si reutilizarea conexiunilor
    // .. 
  
  public initialize = async () : Promise<void> => { // Returnam un Promise 
        try{ // Incercam 
               // SA CONSTRUIM O BAZA DE DATE DACA ACEASTA NU EXISTA 
            await this.databaseConnectionPool 
                      .query(`CREATE DATABASE IF NOT EXISTS \`${dbConfig.database}\``) 

            this.databaseConnectionPool = mysqlConection.createPool({  
                // Construim un pool de conexiuni precizand numele bazei de date 
                ...dbConfig,
                
                waitForConnections:true, // Asteptam pentru conexiune daca sunt ocupate 
                connectionLimit:10, // Limita pentru conexiuni in asteptare atunci cand poolul este plin . 
                queueLimit:0, // Nu stabilim o limita 
                debug:true // Afisam in consola anumite informatii referitoare la operatiuni.
            })
             // Afisam un mesaj ca totul e ok 
            console.log(`AM CONSTRUIT SI AM INITIALIZAT CU SUCCES UN POOL DE CONEXIUNI !!`)
        }
        catch(err) // DACA APARE O EROARE PE URMA ACESTOR OPERATIUNI 
        {
            console.error(`A APARUT O EROARE LA CONEXIUNEA CU BAZA DE DATE ${dbConfig.database} : ${err}`)
            throw err // Declansam eroarea 
        }

    }

    
    public getPoolConnection = () : mysqlConection.Pool =>  {  // Reutilizam poolul de conexiuni 
        return this.databaseConnectionPool 
    }
  
} 

** Testare ** 

Construim o functie asincrona (doarece returnam un Promise) in 'index.ts' , numita 'connectDB'  , care ne efectueaza o conexiune la baza de date

export class API{  
  //////////.................
  
 constructor()
  {
    //........
    this.connectDB() // Declansam Functia 
  }
  
public connectDB = async () => {
        try{
             let dbInstance = DBConnection.getInstance() // Primim instanta si construim o conexiune cu credentiale 
                     await dbInstance.initialize()   // Construim o baza de date daca aceasta NU exista SI pregatim un pool de conexiuni   
                              console.log(`CONEXIUNEA CU BAZA DE DATE A FOST REALIZATA CU SUCCES !!`) 
        }
          catch(err)
          {
            console.error(`A aparut o eroare la conectarea cu baza de date : ${err} `);
          }
    }
}

Dupa care , rulam serverul prin 'cmd' cu 

npm run dev

si primim ca rezultat 

F-r-titlu.png

NOTA ** :  NU VOM AVEA NEVOIE DE MODIFICARILE FACUTE DE LA 'TESTARE' IN JOS , AM VRUT SA FAC O DEMONSTRATIE PE PARTE DE APELARE SI TESTARE !! EA VA FI AUTOMAT , APELATA CAND CONSTRUIM RUTELE SI CONTROLLERELE . 

  • Like 1
  • Fortzaaaa 1
Vizitator
Acest topic este acum închis pentru alte răspunsuri.
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Termeni de Utilizare & Politică Intimitate