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:


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.