NOT a MERCEDES Postat Februarie 17, 2025 Postat Februarie 17, 2025 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 : 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 . 1 1
Postări Recomandate