Како да направите Нест.јс ЦРУД РЕСТ АПИ користећи ТипеОРМ и ПостгреСКЛ

Slično drugim Node.js okvirima, Nest.js pruža obiman set alata za kreiranje snažnih i skalabilnih pozadinskih servisa. Ipak, ključno je razumeti kako efikasno implementirati operacije kreiranja, čitanja, ažuriranja i brisanja (CRUD) u Nest.js – to su najosnovnije operacije pri razvoju API-ja.

U ovom tekstu, saznaćete kako da izgradite Nest.js CRUD REST API koristeći TypeORM i PostgreSQL bazu podataka.

Početak rada sa Nest.js

Za početak, instalirajte Nest.js alatku komandne linije:

 npm i -g @nestjs/cli 

Zatim, kreirajte novi projekat pokretanjem sledeće komande:

 nest new crud-app 

CLI alatka će vas pitati da izaberete menadžera paketa, odaberite opciju koja vam najviše odgovara. Mi ćemo koristiti npm, Node paket menadžer.

CLI će generisati osnovni Nest.js projekat sa svim neophodnim konfiguracionim fajlovima i početnim zavisnostima koje su potrebne za pokretanje aplikacije.

Na kraju, uđite u direktorijum projekta i pokrenite razvojni server.

 cd crud-app
npm run start

Kod ovog projekta možete pronaći u GitHub repozitorijumu.

Kreiranje PostgreSQL baze podataka

Ovaj vodič koristi instancu PostgreSQL baze u oblaku, ali možete podesiti i lokalnu PostgreSQL bazu podataka. PostgreSQL možete instalirati na Windows, macOS ili Linux operativnim sistemima.

Da biste podesili instancu PostgreSQL baze u oblaku:

  • Posetite ElephantSQL, registrujte se i prijavite se na stranicu sa pregledom vašeg naloga.
  • Kliknite na dugme „Create new instance“ u gornjem levom delu stranice kako biste kreirali novu instancu za vašu aplikaciju.
  • Unesite naziv vaše instance, izaberite besplatni plan i na kraju izaberite region da biste završili proces podešavanja.
  • Nakon što je instanca baze podataka kreirana, idite na stranicu sa podešavanjima i kopirajte navedeni URL baze podataka.
  • Konfigurisanje veze sa bazom podataka

    U osnovnom direktorijumu vašeg projekta, kreirajte .env fajl i nalepite URL veze sa bazom podataka na sledeći način:

     DATABASE_URL="<vaš url veze ovde>" 

    Sada instalirajte ove pakete:

     npm install pg typeorm @nestjs/typeorm @nestjs/config 

    Zatim, kreirajte modul za bazu podataka koristeći CLI alatku.

     nest g module database 

    Otvorite fajl database/database.module.ts i dodajte sledeći konfiguracioni kod za bazu podataka:

     import { Module } from '@nestjs/common';
    import { ConfigModule, ConfigService } from '@nestjs/config';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { User } from '../users/models/user.entity';

    @Module({
      imports: [
        TypeOrmModule.forRootAsync({
          imports: [ConfigModule],
          inject: [ConfigService],

          useFactory: async (configService: ConfigService) => ({
            type: 'postgres',
            url: configService.get('DATABASE_URL'),
            entities: [User],
            synchronize: true
          }),
        }),
      ],
    })

    export class DatabaseModule {}

    Ovaj modul baze podataka upravlja vezom tako što konfiguriše TypeORM modul sa potrebnim parametrom za vezu, URL-om baze podataka.

    Pored toga, definiše entitet „User“ kao deo konfiguracije koji specificira strukturu i svojstva podataka koji se čuvaju u tabeli PostgreSQL baze podataka.

    U ovoj fazi, vaš kod će verovatno baciti grešku jer još uvek niste kreirali entitet korisnika. To ćete uraditi u narednim koracima.

    Ažuriranje fajla app.module.ts

    Na kraju, ažurirajte glavni modul aplikacije da biste uključili konfiguraciju za modul baze podataka.

     import { Module } from '@nestjs/common';
    import { ConfigModule } from '@nestjs/config';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    import { DatabaseModule } from './database/database.module';

    @Module({
      imports: [
        ConfigModule.forRoot({
          envFilePath: '.env',
        }),
        DatabaseModule,
      ],

      controllers: [AppController],
      providers: [AppService],
    })

    export class AppModule {}

    Definisanje korisničkog modula

    Korisnički modul služi kao centralizovana komponenta, odgovorna za kapsuliranje i upravljanje logikom koja je potrebna za implementaciju CRUD funkcionalnosti API-ja.

    Pokrenite ovu komandu u terminalu kako biste kreirali korisnički modul API-ja.

     nest g module users 

    CLI alatka automatski ažurira fajl app.module.ts kako bi odražavala napravljene promene, pored kreiranja korisničkog modula. Ovo osigurava da je novokreirani modul, „users“, ispravno integrisan u konfiguraciju modula aplikacije.

    Kreiranje korisničkog entiteta

    TypeORM je biblioteka za objektnu-relaciono mapiranje (ORM) koja pojednostavljuje interakcije sa bazom podataka u aplikacijama koje koriste TypeScript mapiranjem JavaScript objekata u tabele baze podataka.

    Kreiranjem entiteta „User“ koristeći TypeORM, definišete strukturu i svojstva podataka korisnika u PostgreSQL bazi podataka.

    U direktorijumu „users“, kreirajte novi fajl „models/user.entity.ts“ i dodajte sledeći kod.

     import { Entity, PrimaryGeneratedColumn, Column, } from "typeorm";

    @Entity()
    export class User {
        @PrimaryGeneratedColumn()
        id: number;

        @Column()
        name: string;

        @Column()
        email: string;
    }

    Entitet „User“ definiše strukturu korisničkih podataka koji se čuvaju u bazi podataka. U ovom slučaju, to je id kao kolona primarnog ključa, kolone sa imenom i e-mailom i njihova odgovarajuća svojstva.

    Kreiranje CRUD API servisa

    Sada kreirajte API servis koji će upravljati logikom za CRUD operacije pokretanjem komande ispod:

     nest g service users 

    Otvorite fajl „user-auth.service.ts“ i dodajte ovaj kod:

     import { Injectable } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { Repository } from 'typeorm';
    import {User} from './models/user.entity';

    @Injectable()
    export class UsersService {
      constructor(
        @InjectRepository(User)
        private userRepository: Repository<User>,
      ) {}

      async findAll(): Promise<User[]> {
        return this.userRepository.find();
      }

      async findOne(id: number): Promise<User> {
        return this.userRepository.findOne({ where: { id } });
      }

      async create(user: Partial<User>): Promise<User> {
        const newuser = this.userRepository.create(user);
        return this.userRepository.save(newuser);
      }

      async update(id: number, user: Partial<User>): Promise<User> {
        await this.userRepository.update(id, user);
        return this.userRepository.findOne({ where: { id } });
      }

      async delete(id: number): Promise<void> {
        await this.userRepository.delete(id);
      }
    }

    Ova klasa „UsersService“ definiše različite API metode namenjene za rukovanje CRUD operacijama. Ove metode uključuju preuzimanje podataka svih korisnika, pronalaženje određenog korisnika pomoću njegovog ID broja, kreiranje novog korisnika, ažuriranje postojećeg korisnika i metodu za brisanje podataka određenog korisnika u bazi podataka.

    Definisanje kontrolera za API

    Kreirajte kontroler koji će upravljati krajnjim tačkama API-ja za operacije koje se odnose na korisnike.

     nest g controller users 

    Zatim, dodajte kod ispod u fajl „users.controller.ts“.

     import { Controller, Get, Post, Body, Put, Param, Delete, NotFoundException, HttpCode } from '@nestjs/common';
    import { UsersService } from './users.service';
    import { User } from './models/user.entity';

    @Controller('api/users')
    export class UsersController {
      constructor(private readonly usersService: UsersService) {}

      @Get()
      async findAll(): Promise<User[]> {
        return this.usersService.findAll();
      }

      @Post()
      @HttpCode(201)
      async create(@Body() user: User): Promise<User> {
        const createdUser = await this.usersService.create(user);
        return createdUser;
      }

      @Put(':id')
      async update (@Param('id') id: number, @Body() user: User): Promise<any> {
        await this.usersService.update(id, user);
        return { message: 'User updated successfully' };
      }

      @Delete(':id')
      async delete(@Param('id') id: number): Promise<any> {
        const user = await this.usersService.findOne(id);

        if (!user) {
          throw new NotFoundException('User does not exist!');
        }

        await this.usersService.delete(id);
        return { message: 'User deleted successfully' };
      }
    }

    Kontroler upravlja krajnjim tačkama API-ja za korisničke operacije. On obrađuje GET zahteve za preuzimanje svih korisnika, POST zahteve za kreiranje novih korisnika, PUT zahteve za ažuriranje postojećih korisnika i DELETE zahteve za brisanje korisnika.

    Koristeći „UsersService“ i interakciju sa entitetom „User“, ovaj kontroler obezbeđuje kompletan API za upravljanje operacijama koje se odnose na korisnike nad podacima koji su uskladišteni u bazi podataka.

    Ažuriranje fajla users.module.ts

    Na kraju, ažurirajte fajl „users.module.ts“ kao što je prikazano u nastavku kako biste bili sigurni da ste ugradili entitet „User“ i TypeORM modul, koji uspostavlja vezu sa bazom podataka.

     import { Module } from '@nestjs/common';
    import { UsersController } from './users.controller';
    import { UsersService } from './users.service';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { User } from './models/user.entity';

    @Module({
      imports: [TypeOrmModule.forFeature([User])],
      controllers: [UsersController],
      providers: [UsersService]
    })

    export class UsersModule {}

    Konačno, pokrenite razvojni server kako biste testirali CRUD operacije koristeći Postman.

     npm run start 

    Server će se pokrenuti na portu 3000 i možete mu slati API zahteve na http://localhost:3000/api/users.

    Izgradnja pozadinskih aplikacija pomoću Nest.js

    Bez obzira da li razvijate jednostavan REST API ili složenu web aplikaciju, Nest.js nudi sveobuhvatan skup funkcija i mogućnosti za konstruisanje pouzdanog i robustnog pozadinskog sistema.

    Nest.js nudi strukturiraniji pristup razvoju projekta nego Express.js. Ovo osigurava da možete pouzdano kreirati, skalirati i održavati složene aplikacije, zahvaljujući njegovom organizovanom i modularnom obrascu dizajna.