So erstellen Sie eine API mit NestJS und PostgreSQL
NestJS und PostgreSQL sind eine gute Kombination zum Erstellen von APIs.
Hallo Leute, in diesem Fall lernen wir etwas über NestJS. NestJS ist eines der beliebtesten Javascript-Frameworks für das Backend. Wir konzentrieren uns auf die Erstellung einer API mit NestJS.
NestJS ist ein Framework zum Erstellen effizienter, skalierbarer serverseitiger Node.js -Anwendungen. Unter der Haube nutzt Nest robuste HTTP-Server-Frameworks wie Express (Standard) und kann optional auch für die Verwendung von Fastify konfiguriert werden!
Es macht wirklich Spaß, die Dokumentation zu verstehen und zu vervollständigen. Klicken Sie auf diesen Link unten, um weitere Informationen zu lesen.
Wenn Sie REST API, Graphql, Websockets, Microservice usw. erstellen möchten, können Sie auf jeden Fall NestJS verwenden, da alles sofort einsatzbereit ist und einfach dem Muster von NestJs folgt.
Das Muster von NestJs sieht aus wie ein Angular 2+. Wenn Sie also Frontend-Entwickler (Angular) sind und dann Ihre Fähigkeiten erweitern möchten, um ein Backend-Entwickler mit einem ähnlichen Angular-Muster zu werden, ist dieser Artikel genau das Richtige für Sie.
PostgreSQL ist ein leistungsstarkes, objektrelationales Open-Source-Datenbanksystem, das die SQL-Sprache nutzt und erweitert, kombiniert mit vielen Funktionen, die die kompliziertesten Daten-Workloads sicher speichern und skalieren.
Aber ich möchte nicht viel über PostgreSQL sprechen, sondern nur zur Einführung. Wenn Sie weitere Informationen lesen möchten, können Sie diesen Link unten besuchen.
In diesem Fall verwenden wir eine kostenlose Datenbank PostgreSQL vonhttps://elephantsql.com/. Stellen Sie also sicher, dass Sie ein Konto erstellt haben.
Lassen Sie uns gemeinsam eine API mit NestJS erstellen. Zunächst gehe ich davon aus, dass Sie NodeJs und NPM installiert haben. In diesem Fall verwende ich NodeJS-Version 16.18.1 und NPM-Version 8.19.2
Ich empfehle Ihnen, NVM zu verwenden, um viele Versionen von NodeJS zu verwalten und die Version von NodeJS einfach zu ändern.
Installation
Sie müssen die NestJS-CLI installieren. Bitte verwenden Sie Version 9.0.0 von NestJS, um sicherzustellen, dass wir dieselbe Version haben, um eine API mit NestJS zu erstellen und unerwartete Fehler zu vermeiden.
npm i -g @nestjs/[email protected]
Nachdem die Installation abgeschlossen ist. Lassen Sie uns das Projekt starten, um diesen Befehl auszuführen.
nest new nestjs-todolist
Anschließend müssen Sie dieses Paket installieren, damit das Dienstprogramm eine API mit PostgreSQL erstellen kann.
npm i --save @nestjs/config @nestjs/typeorm typeorm pg
Als nächstes müssen wir app.module.ts wie folgt aktualisieren
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 ist ein Modul zum Konfigurieren der Datenbank, da wir, wie Sie wissen, Postgres verwenden. Wir können jedoch auch einen anderen Datenbanktyp verwenden, z. B. MySQL, Mongo, Postgres usw.
Klicken Sie einfach auf die Schaltfläche, um eine neue Instanz zu erstellen .
Geben Sie anschließend den Namen ein und wählen Sie einen kostenlosen Plan aus. Klicken Sie dann auf die Schaltfläche Region auswählen .
Wählen Sie anschließend das Rechenzentrum aus. Standardmäßig erfolgt die automatische Auswahl abhängig davon, woher Sie kommen. Beispiel: Wenn Sie aus Europa kommen, wird „EU“ ausgewählt. Klicken Sie also einfach auf die Schaltfläche „Überprüfen“, um zum nächsten Schritt zu gelangen.
Wenn alle Angaben gültig sind, klicken Sie einfach auf die Schaltfläche zum Erstellen einer Instanz . Warten Sie nur eine Minute. Wenn Sie fertig sind, klicken Sie einfach auf das Detail der Instanzdatenbank. Die Detailseite sieht also wie in diesem Bild unten aus
Kopieren Sie anschließend den URL-Link Ihrer Datenbankinstanz und fügen Sie ihn in die Datei .env mit dem Variablennamen DATABASE_URL ein .
Wir müssen sicherstellen, dass die Verbindung zwischen PostgreSQL und dem Projekt kein Fehler ist. Führen Sie einfach diesen Befehl aus
npm run start
API erstellen
Die gesamte Konfiguration ist abgeschlossen. Lassen Sie uns zum Haupttutorial springen und eine API erstellen. Wir müssen ein Modul, einen Controller, Dienste, eine Klasse und eine Schnittstelle generieren.
Ach ja, ich habe vergessen, die leistungsstarke CLI NestJS zu erwähnen. Wir können eine Datei erstellen und uns das Bild unten ansehen.
Führen Sie als Nächstes diesen Befehl aus, um das Modul, den Controller, die Klasse, die Schnittstelle und die Dienste zu generieren.
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
Erstellen Sie eine Dateientität für todolist mit dem Dateinamen todolist.entity.ts im Ordner src/todolist/entities und fügen Sie dieses Skript hinzu
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 ist eine Funktion zum Generieren einer ID mit automatischer Inkrementierung als Primärschlüssel.
- @Column ist eine Funktion zum Definieren eines Felds in der Tabelle
- Der Status von todolist ist enum StatusTodo mit dem Standardwert todo.
- Der Grund, warum wir die Nummer am due_date verwenden, besteht darin, unterschiedliche Zeitzonen zu verarbeiten.
Danach müssen wir ein DTO (Data Transfer Object) erstellen, um sicherzustellen, dass die Eigenschaftsanforderung des Clients im Backend verfügbar ist. Außerdem müssen wir zur Validierung diese Bibliothek installieren
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() ist eine Funktion zur Validierung des Werts der Eigenschaft sollte string sein
- @Length() ist eine Funktion zur Validierung des minimalen und maximalen Zeichenwerts
- @IsNumber() ist eine Funktion zur Validierung des Werts der Eigenschaft im Falle einer Zahl
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;
}
Öffnen Sie anschließend die Datei todolist.module.ts und importieren Sie typeorm mit einer Funktion aus der todolist-Entität.
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
Kehren wir zur IDE zurück, um eine API zu erstellen. Öffnen Sie die Datei todolist.controller.ts. Die Funktion des Controllers in NestJS besteht darin, Anfragen von Benutzern zu bearbeiten, auf Benutzer zu reagieren und Routen-APIs zu definieren.
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);
}
}
- Wir müssen den Abhängigkeits-Todolist-Dienst einfügen, um Daten von NestJS in die Datenbank mit Typeorm zu verwalten.
- @Param() ist eine Funktion zum Abfangen des Pfadparameters in der Routen-API. Beispiel: /todolist/:id
- @Body() ist eine Funktion zum Abrufen aller Feldanforderungen von Clients per DTO
- @GET(), @POST() , @PUT(), @DELETE() ist eine Methode auf HTTP
- ParseIntPipe ist eine Funktion zum Konvertieren der ID oder des Parameters in eine Zahl.
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 diesem Fall verwenden wir asynchrones Warten, das heißt Promise, aber wenn Sie Observable sein möchten, ist das natürlich möglich, Sie müssen es nur in Observable konvertieren.
- this.todolistRepository ist eine Instanzfunktion von typeorm mit vielen Methoden zum Verwalten von Daten in einer Datenbank, z. B. „Find“, „FindOneBy“, „Create“, „Save“, „Update“ und „Delete“.
- HttpException ist eine Funktion von nestjs, die Daten auslöst, wenn die Daten nicht gefunden werden oder ein Fehler auftritt.
- HttpStatus ist eine Funktion zum Definieren aller HTTP-Statuscodes wie 200, 300, 400 und 500.
- Todolist vom Typ const todolist dient zum Deklarieren aller Eigenschaften aus der Antwort.
Test-API
Zum Testen der API können wir Postman verwenden. Stellen Sie vor dem Testen sicher, dass das Projekt „nestjs“ ausgeführt wird. Mit diesem Befehl können Sie eine automatische Neuerstellung durchführen, wenn Änderungen am Projekt vorgenommen werden.
npm run start:dev
- NIMM ALLE
- Holen Sie sich eins
- AKTUALISIEREN
- LÖSCHEN
- Validierung
- Überprüfen Sie von ElephantSQL
Herausforderung
Nur für die Übung können Sie versuchen, eine API zu erstellen, um den Status der Fortschrittsliste zu aktualisieren, z. B. Todo, Fortschritt und Abgeschlossen. Behalte es im Geiste!
Schließen
Hoffentlich ist dieser Artikel nützlich und verbessert Ihre Fähigkeiten. Natürlich lerne ich immer noch, wie Sie wissen, denn wenn wir lebenslange Lernende sind, werden wir wissen, dass die Welt sehr weit ist. Wenn Sie mit mir Kontakt aufnehmen möchten, zögern Sie nicht, mich unter [email protected] zu kontaktieren . Vielen Dank.
Verweise
#nestjs #postgresql #backend #tutorial #restapi

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































