Comment créer une API avec NestJS et PostgreSQL
NestJS et PostgreSQL sont une bonne combinaison pour créer une API.
Bonjour les gars, Dans ce cas, nous en apprendrons davantage sur NestJS. NestJS est l'un des frameworks javascript populaires pour le backend. Nous nous concentrerons sur la création d'une API avec NestJS.
NestJS est un cadre permettant de créer des applications côté serveur Node.js efficaces et évolutives . Sous le capot, Nest utilise des cadres de serveur HTTP robustes comme Express (par défaut) et peut éventuellement être configuré pour utiliser également Fastify !
La documentation est vraiment agréable à comprendre et à compléter. Cliquez sur ce lien ci-dessous pour lire plus d'informations.
Si vous souhaitez créer une API REST, Graphql, Websockets, Microservice, etc. Vous pouvez absolument utiliser NestJS car tout est prêt à l'emploi et suivez simplement le modèle de NestJs.
Le modèle de NestJs ressemble à un Angular 2+, donc, si votre expérience est développeur frontend (Angular) et que vous souhaitez développer vos compétences pour devenir un développeur backend avec un modèle similaire d'Angular, cet article est fait pour vous.
PostgreSQL est un puissant système de base de données relationnelle objet open source qui utilise et étend le langage SQL combiné à de nombreuses fonctionnalités qui stockent et mettent à l'échelle en toute sécurité les charges de travail de données les plus complexes.
Mais, je ne veux pas parler beaucoup de PostgreSQL, juste pour l'introduction et si vous voulez lire plus d'informations, vous pouvez visiter ce lien ci-dessous.
Dans ce cas, nous utiliserons une base de données gratuite PostgreSQL dehttps://elephantsql.com/. Alors, assurez-vous d'avoir créé un compte.
Créons ensemble une API avec NestJS. Tout d'abord, je suppose que vous avez installé NodeJs et NPM. Dans ce cas, j'utilise nodejs version 16.18.1 et npm version 8.19.2
Je vous suggère d'utiliser NVM pour gérer de nombreuses versions de nodejs et changer facilement la version de nodejs.
Installation
Vous devez installer NestJS CLI. Veuillez utiliser la version 9.0.0 de NestJS pour vous assurer que nous avons la même version pour créer l'API avec NestJS afin d'éviter des erreurs inattendues.
npm i -g @nestjs/[email protected]
Une fois l'installation terminée. Lançons le projet pour exécuter cette commande.
nest new nestjs-todolist
Ensuite, vous devez installer ce package pour que l'utilitaire crée une API avec PostgreSQL.
npm i --save @nestjs/config @nestjs/typeorm typeorm pg
Ensuite, sur le app.module.ts, nous devons mettre à jour comme ceci
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 est un module pour configurer la base de données car vous savez que nous utilisons Postgres. Mais, nous pouvons utiliser un autre type de base de données, comme mysql, mongo, postgres, etc.
Cliquez simplement sur le bouton pour créer une nouvelle instance .
Après cela, veuillez remplir le nom et choisir un plan gratuit. Ensuite, cliquez sur le bouton Sélectionner une région .
Après cela, choisissez le centre de données. Par défaut, la sélection automatique dépend d'où vous venez. Exemple : lorsque vous venez d'Europe, il sera sélectionné sur l'UE. Alors, cliquez simplement sur le bouton Revoir à l'étape suivante.
Si toutes les informations sont valides, il suffit de cliquer sur le bouton pour créer une instance . Attendez une minute. Après avoir terminé, cliquez simplement sur le détail de la base de données d'instance. Ainsi, la page de détail ressemble à cette image ci-dessous
Après cela, copiez le lien URL de votre instance de base de données et collez-le dans le fichier .env avec le nom de variable DATABASE_URL .
Nous devons nous assurer que la connexion entre PostgreSQL et le projet n'est pas une erreur. exécutez simplement cette commande
npm run start
Créer une API
Toute la configuration est faite. Passons au didacticiel principal et construisons une API. Nous devons générer un module, un contrôleur, des services, une classe et une interface.
Ah oui, j'oublie de mentionner le puissant CLI NestJS. Nous pouvons générer un fichier et regarder l'image ci-dessous.
Ensuite, exécutez cette commande pour générer le module, le contrôleur, la classe, l'interface et les services.
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
Créez une entité de fichier pour todolist avec le nom de fichier todolist.entity.ts dans le dossier src/todolist/entities et ajoutez ce 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 est une fonction permettant de générer un identifiant avec incrémentation automatique en tant que clé primaire.
- @Column est une fonction pour définir un champ sur la table
- Le statut de todolist est enum StatusTodo avec la valeur par défaut todo.
- La raison pour laquelle nous utilisons le numéro à due_date est de gérer un fuseau horaire différent.
Après cela, nous devons créer un DTO (Data Transfer Object) pour nous assurer que la demande de propriété du client est disponible sur le backend. De plus, pour la validation, nous devons installer cette bibliothèque
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() est une fonction pour valider la valeur de la propriété devrait chaîne
- @Length() est une fonction pour valider la valeur minimale et maximale des caractères
- @IsNumber() est une fonction pour valider la valeur de la propriété si le nombre
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;
}
Après cela, ouvrez le fichier todolist.module.ts et importez typeorm avec une fonctionnalité de l'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
Revenons à l'IDE pour créer l'API. Ouvrez le fichier todolist.controller.ts. La fonction du contrôleur dans NestJS est de gérer les demandes des utilisateurs, de répondre aux utilisateurs et de définir les routes 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);
}
}
- Nous devons injecter le service de dépendance todolist pour gérer les données de nestjs à la base de données avec typeorm.
- @Param() est une fonction pour attraper le paramètre de chemin sur l'API de route. exemple : /todolist/:id
- @Body() est une fonction pour obtenir toutes les demandes de champ des clients par DTO
- @GET(), @POST() , @PUT(), @DELETE() est une méthode sur HTTP
- ParseIntPipe est une fonction pour convertir l'id ou le paramètre en un nombre.
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;
}
}
- Dans ce cas, nous utilisons l'attente asynchrone, cela signifie que c'est Promise, mais si vous voulez être observable, bien sûr, c'est possible, il vous suffit de le convertir en observable.
- this.todolistRepository est une fonction d'instance de typeorm avec de nombreuses méthodes pour gérer les données d'une base de données, telles que find, findOneBy, create, save, update et delete.
- HttpException est une fonction de nestjs pour lancer des données lorsque les données ne sont pas trouvées ou obtiennent une erreur.
- HttpStatus est une fonction permettant de définir tous les codes d'état HTTP tels que 200, 300, 400 et 500.
- Todolist sur le type const todolist sert à déclarer toutes les propriétés de la réponse.
API de test
Pour tester l'API, nous pouvons utiliser Postman. Avant de tester, assurez-vous que le projet nestjs était en cours d'exécution. Vous pouvez utiliser cette commande pour reconstruire automatiquement en cas de modifications du projet.
npm run start:dev
- AVOIR TOUT
- PRENDS EN UN
- MISE À JOUR
- SUPPRIMER
- Validation
- Vérifier depuis ElephantSQL
Défi
Juste pour l'exercice, vous pouvez essayer de créer une API pour mettre à jour le statut de la liste de tâches de progression, telle que todo, progress et terminé. Gardez-le Esprit !
Fermeture
J'espère que cet article est utile et améliore vos compétences. Bien sûr, j'apprends encore comme vous le savez, car lorsque nous serons des apprenants de longue durée, nous saurons que le monde est très vaste. Si vous souhaitez me contacter, n'hésitez pas à me contacter à [email protected] Merci.
Les références
#nestjs #postgresql #backend #tutoriel #restapi
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































