Come creare API con NestJS e PostgreSQL
NestJS e PostgreSQL sono una buona combinazione per creare API.
Salve ragazzi, in questo caso impareremo a conoscere NestJS. NestJS è uno dei popolari framework javascript per il backend. Ci concentreremo su come creare API con NestJS.
NestJS è un framework per la creazione di applicazioni lato server Node.js efficienti e scalabili . Sotto il cofano, Nest utilizza robusti framework HTTP Server come Express (l'impostazione predefinita) e facoltativamente può essere configurato per utilizzare anche Fastify !
La documentazione è davvero piacevole da capire e completare. Fare clic su questo collegamento sottostante per leggere ulteriori informazioni.
Se vuoi creare REST API, Graphql, Websockets, Microservice e così via. Assolutamente puoi usare NestJS perché tutto è pronto per l'uso e segui semplicemente il modello di NestJs.
Il pattern di NestJs si presenta come un Angular 2+, quindi, se il tuo background è Frontend Developer (Angular) e quindi vuoi espandere le tue abilità per diventare un Backend Developer con un pattern simile di Angular, questo articolo fa al caso tuo.
PostgreSQL è un potente sistema di database relazionale a oggetti open source che utilizza ed estende il linguaggio SQL combinato con molte funzionalità che archiviano e ridimensionano in modo sicuro i carichi di lavoro di dati più complicati.
Ma non voglio parlare molto di PostgreSQL, solo per introduzione e se vuoi leggere maggiori informazioni puoi visitare questo link qui sotto.
In questo caso, utilizzeremo un database gratuito PostgreSQL dahttps://elephantsql.com/. Quindi, assicurati di aver creato un account.
Creiamo insieme un'API con NestJS. Prima di tutto, presumo che tu abbia installato NodeJs e NPM. In questo caso, utilizzo nodejs versione 16.18.1 e npm versione 8.19.2
Ti suggerisco di utilizzare NVM per gestire molte versioni di nodejs e cambiare facilmente la versione di nodejs.
Installazione
Devi installare l'interfaccia a riga di comando di NestJS. Utilizza la versione 9.0.0 di NestJS per assicurarti di avere la stessa versione per creare l'API con NestJS per evitare errori imprevisti.
npm i -g @nestjs/[email protected]
Al termine dell'installazione. Avviamo il progetto per eseguire questo comando.
nest new nestjs-todolist
Quindi, è necessario installare questo pacchetto affinché l'utilità crei l'API con PostgreSQL.
npm i --save @nestjs/config @nestjs/typeorm typeorm pg
Successivamente, su app.module.ts dobbiamo aggiornare in questo modo
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRoot({
type: 'postgres',
url: process.env.DATABASE_URL,
autoLoadEntities: true,
synchronize: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
- TypeOrmModule è un modulo per configurare il database come sai che stiamo usando Postgres. Ma possiamo usare un altro tipo di database, come mysql, mongo, postgres, ecc.
Basta fare clic sul pulsante per creare una nuova istanza .
Successivamente, inserisci il nome e scegli un piano gratuito. Quindi, fai clic sul pulsante Seleziona regione .
Successivamente, scegli il data center. Per impostazione predefinita, selezionerà automaticamente a seconda di dove vieni. Esempio: se provieni dall'Europa, sarà selezionato su UE. Quindi, basta fare clic sul pulsante Revisiona per il passaggio successivo.
Se tutte le informazioni sono valide, basta fare clic sul pulsante per creare un'istanza . Aspetta solo un minuto. Dopo aver terminato basta fare clic sui dettagli del database dell'istanza. Quindi, la pagina dei dettagli assomiglia a questa immagine qui sotto
Successivamente, copia il collegamento URL dell'istanza del database e incollalo nel file .env con il nome della variabile DATABASE_URL .
Dobbiamo assicurarci che la connessione tra PostgreSQL e il progetto non sia un errore. basta eseguire questo comando
npm run start
Crea API
Tutta la configurazione è terminata. Passiamo al tutorial principale e creiamo un'API. Abbiamo bisogno di generare un modulo, controller, servizi, classe e interfaccia.
Ah sì, ho dimenticato di menzionare il potente CLI NestJS. Possiamo generare un file e guardare l'immagine qui sotto.
Successivamente, esegui questo comando per generare il modulo, il controller, la classe, l'interfaccia e i servizi.
npx nest generate module todolist && npx nest generate controller todolist/controllers/todolist && npx nest generate service todolist/services/todolist && npx nest generate interface todolist/interfaces/todolist
Command Generate NestJs
Crea entità file per todolist con nome file todolist.entity.ts nella cartella src/todolist/entities e aggiungi questo script
import {
Column,
CreateDateColumn,
Entity,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
export enum StatusTodo {
TODO = 'todo',
PROGRESS = 'progress',
COMPLETED = 'completed',
}
@Entity()
export class TodolistEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
@Column({ type: 'enum', default: StatusTodo.TODO, enum: StatusTodo })
status: string;
@Column({ nullable: true, type: 'bigint', default: new Date().getTime() })
due_date: number;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}
- @PrimaryGeneratedColum è una funzione per generare un id con incremento automatico come chiave primaria.
- @Column è una funzione per definire un campo sulla tabella
- Lo stato di todolist è enum StatusTodo con il valore predefinito todo.
- Il motivo per cui in due_date stiamo usando il numero è per gestire diversi fusi orari.
Successivamente, dobbiamo creare DTO (Data Transfer Object) per assicurarci che la richiesta di proprietà dal client sia disponibile sul back-end. Inoltre, per la convalida, dobbiamo installare questa libreria
npm i --save class-validator class-transformer
import { IsNotEmpty, IsNumber, IsString, Length } from "class-validator";
export class TodolistDto {
@IsNotEmpty()
@IsString()
@Length(10, 20)
title: string;
@IsNotEmpty()
@IsString()
@Length(0, 40)
description: string;
@IsString()
status: string;
@IsNumber()
@IsNotEmpty()
due_date: number;
}
- @IsString() è una funzione per convalidare il valore della proprietà dovrebbe stringa
- @Length() è una funzione per convalidare il valore minimo e massimo del carattere
- @IsNumber() è una funzione per convalidare il valore della proprietà se il numero
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
export interface Todolist {
id: number;
title: string;
description: string;
status: string;
due_date: number;
createdAt: Date;
updatedAt: Date;
}
Successivamente, apri il file todolist.module.ts e importa typeorm con una funzionalità dall'entità todolist.
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TodolistController } from './controllers/todolist/todolist.controller';
import { TodolistEntity } from './entities/todolist.entity';
import { TodolistService } from './services/todolist/todolist.service';
@Module({
imports: [TypeOrmModule.forFeature([TodolistEntity])],
controllers: [TodolistController],
providers: [TodolistService]
})
export class TodolistModule {}
npm run start
Torniamo all'IDE per creare l'API. Apri il file todolist.controller.ts. La funzione del controller in NestJS è gestire le richieste degli utenti, rispondere agli utenti e definire le route API.
import {
Body,
Controller,
Delete,
Get,
Param,
ParseIntPipe,
Post,
Put,
} from '@nestjs/common';
import { TodolistDto } from 'src/todolist/dtos/todolist.dto';
import { TodolistService } from 'src/todolist/services/todolist/todolist.service';
@Controller('todolist')
export class TodolistController {
constructor(private readonly todolistService: TodolistService) {}
@Get()
findAll() {
return this.todolistService.findAll();
}
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
return this.todolistService.findOne(id);
}
@Post()
create(@Body() todolistDto: TodolistDto) {
return this.todolistService.create(todolistDto);
}
@Put(':id')
update(
@Param('id', ParseIntPipe) id: number,
@Body() todolistDto: TodolistDto,
) {
return this.todolistService.update(id, todolistDto);
}
@Delete(':id')
delete(@Param('id', ParseIntPipe) id: number) {
return this.todolistService.delete(id);
}
}
- Abbiamo bisogno di iniettare il servizio todolist di dipendenza per gestire i dati da nestjs al database con typeorm.
- @Param() è una funzione per rilevare il parametro del percorso sull'API del percorso. esempio: /todolist/:id
- @Body() è una funzione per ottenere tutte le richieste di campo dai client tramite DTO
- @GET(), @POST() , @PUT(), @DELETE() è un metodo su HTTP
- ParseIntPipe è una funzione per convertire l'id o il param in un numero.
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { TodolistDto } from 'src/todolist/dtos/todolist.dto';
import { TodolistEntity } from 'src/todolist/entities/todolist.entity';
import { Todolist } from 'src/todolist/interfaces/todolist/todolist.interface';
import { Repository } from 'typeorm';
@Injectable()
export class TodolistService {
constructor(
@InjectRepository(TodolistEntity)
private todolistRepository: Repository<TodolistEntity>,
) {}
async delete(id: number) {
const todolist: Todolist = await this.todolistRepository.findOneBy({ id });
if (!todolist) {
throw new HttpException(
`Todolist with id=${id} not found!`,
HttpStatus.BAD_REQUEST,
);
}
return this.todolistRepository.delete(id);
}
async update(id: number, todolistDto: TodolistDto) {
const todolist: Todolist = await this.todolistRepository.findOneBy({ id });
if (!todolist) {
throw new HttpException(
`Todolist with id=${id} not found!`,
HttpStatus.BAD_REQUEST,
);
}
return this.todolistRepository.update(id, todolistDto);
}
async findOne(id: number) {
const todolist: Todolist = await this.todolistRepository.findOneBy({ id });
if (!todolist) {
throw new HttpException(
`Todolist with id=${id} not found!`,
HttpStatus.BAD_REQUEST,
);
}
return todolist;
}
async findAll() {
return await this.todolistRepository.find();
}
async create(todolistDto: TodolistDto) {
const newTodolist = await this.todolistRepository.create({
...todolistDto,
});
const saveTodolist = await this.todolistRepository.save(newTodolist);
if (!saveTodolist) {
throw new HttpException(`Create todolist failed`, HttpStatus.BAD_REQUEST);
}
return saveTodolist;
}
}
- In questo caso, stiamo usando l'attesa asincrona, significa che è Promessa, ma se vuoi essere osservabile ovviamente è possibile, devi solo convertirlo in osservabile.
- this.todolistRepository è una funzione di istanza di typeorm con molti metodi per gestire i dati su un database, come find, findOneBy, create, save, update ed delete.
- HttpException è una funzione di nestjs per lanciare dati quando i dati non vengono trovati o ricevono qualche errore.
- HttpStatus è una funzione per definire tutti i codici di stato HTTP come 200, 300, 400 e 500.
- Todolist sul tipo const todolist serve per dichiarare tutte le proprietà dalla risposta.
API di prova
Per testare l'API, possiamo usare Postman. Prima di eseguire il test, assicurati che il progetto nestjs sia in esecuzione. È possibile utilizzare questo comando per ricostruire automaticamente quando sono presenti modifiche dal progetto.
npm run start:dev
- PRENDI TUTTO
- PRENDINE UNO
- AGGIORNAMENTO
- ELIMINARE
- Convalida
- Controlla da ElephantSQL
Sfida
Solo per l'esercizio, puoi provare a creare un'API per aggiornare lo stato dell'elenco dei progressi, ad esempio cose da fare, progressi e completato. Mantienilo Spirito!
Chiusura
Speriamo che questo articolo sia utile e migliori le tue capacità. Certo, sto ancora imparando come sai, perché quando impareremo a lungo, sapremo che il mondo è molto vasto. Se vuoi contattarmi, non esitare a contattarmi a [email protected] Grazie.
Riferimenti
#nestjs #postgresql #backend #tutorial #restapi

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































