Hvordan bygge en Nest.js CRUD REST API ved å bruke TypeORM og PostgreSQL

Som andre Node.js-rammeverk tilbyr Nest.js et omfattende verktøysett for å bygge robuste og skalerbare backend-tjenester. Ikke desto mindre er det viktig å forstå hvordan du kan implementere opprette, lese, oppdatere og slette (CRUD) operasjoner i Nest.js effektivt – dette er de mest grunnleggende operasjonene i utviklingen av APIer.

Lær hvordan du bygger en Nest.js CRUD REST API ved hjelp av TypeORM og en PostgreSQL-database.

Komme i gang med Nest.js

For å komme i gang, installer kommandolinjeverktøyet Nest.js:

 npm i -g @nestjs/cli 

Deretter oppretter du et nytt prosjekt ved å kjøre:

 nest new crud-app 

CLI-verktøyet vil be deg om å velge en pakkebehandling, velg det alternativet du finner mest å foretrekke. Vi bruker npm, Node-pakkebehandleren.

CLI vil stillas et grunnleggende Nest.js-prosjekt med alle nødvendige konfigurasjonsfiler og innledende avhengigheter som kreves for å kjøre applikasjonen.

Til slutt, naviger til prosjektkatalogen og start utviklingsserveren.

 cd crud-app
npm run start

Du kan finne dette prosjektets kode i sin GitHub oppbevaringssted.

Opprett en PostgreSQL-database

Denne opplæringen bruker en Cloud PostgreSQL-forekomst, men du kan sette opp en lokal PostgreSQL-database i stedet. Du kan installere PostgreSQL på Windows, på macOS eller på Linux.

For å sette opp en sky PostgreSQL-forekomst:

  • Gå over til ElephantSQLregistrer deg og logg på kontooversiktssiden.
  • Klikk på knappen Opprett ny forekomst øverst til venstre på siden for å opprette en ny forekomst for applikasjonen din.
  • Fyll inn navnet på forekomsten din, velg gratisplanen, og velg til slutt regionen for å fullføre oppsettsprosessen.
  • Etter å ha opprettet databaseforekomsten, gå til innstillingssiden og kopier den oppgitte database-URLen.
  •   Hvorfor taper Acorns-kontoen din penger?

    Konfigurer databasetilkoblingen

    Opprett en .env-fil i prosjektets rotkatalog og lim inn URL-adressen til databasetilkoblingen som følger:

     DATABASE_URL="<your connection url here>" 

    Installer nå disse pakkene:

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

    Deretter går du videre og oppretter en databasemodul ved å bruke CLI-verktøyet.

     nest g module database 

    Åpne database/database.module.ts-filen og legg til følgende databasekonfigurasjonskode:

     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 {}

    Denne databasemodulen håndterer tilkoblingen ved å konfigurere TypeORM-modulen med den nødvendige tilkoblingsparameteren, databasens URL.

    I tillegg definerer den brukerenheten som en del av konfigurasjonen som spesifiserer strukturen og egenskapene til dataene som er lagret i PostgreSQL-databasetabellen.

    På dette stadiet vil koden sannsynligvis gi en feil fordi du ikke har opprettet brukerenheten ennå. Du vil gjøre det i de følgende trinnene.

    Oppdater app.module.ts-filen

    Til slutt oppdaterer du hovedapplikasjonsmodulen for å inkludere konfigurasjonen for databasemodulen.

     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 {}

    Definer en brukermodul

    Brukermodulen fungerer som en sentralisert komponent, ansvarlig for å innkapsle og administrere logikken som kreves for å implementere APIens CRUD-funksjonalitet.

    Kjør denne terminalkommandoen for å lage API-ens brukermodul.

     nest g module users 

    CLI-verktøyet oppdaterer automatisk app.module.ts-filen for å gjenspeile endringene som er gjort, i tillegg til å opprette brukermodulen. Dette sikrer at den nyopprettede modulen, brukere, er riktig integrert i applikasjonens modulkonfigurasjon.

      14 Premium Antivirus for å sikre PC-en din

    Opprett en brukerenhet

    TypeORM er et Object-Relational Mapping (ORM)-bibliotek som forenkler databaseinteraksjoner i applikasjoner som bruker TypeScript ved å tilordne JavaScript-objekter til databasetabeller.

    Ved å opprette en brukerenhet ved hjelp av TypeORM, definerer du strukturen og egenskapene til brukerdataene i PostgreSQL-databasen.

    I brukerkatalogen oppretter du en ny models/user.entity.ts og legger til følgende kode.

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

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

        @Column()
        name: string;

        @Column()
        email: string;
    }

    Brukerenheten definerer strukturen til brukerdataene som er lagret i databasen. I dette tilfellet er det ID-en som primærnøkkelkolonnen, og navn- og e-postkolonnene og deres tilsvarende egenskaper.

    Opprett CRUD API-tjenesten

    Opprett nå API-tjenesten som vil administrere logikken for CRUD-operasjonene ved å kjøre kommandoen nedenfor:

     nest g service users 

    Åpne user-auth.service.ts-filen og legg til denne koden:

     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);
      }
    }

    Denne UsersService-klassen definerer ulike API-metoder dedikert til å håndtere CRUD-operasjoner. Disse metodene inkluderer å hente alle brukernes data, finne en spesifikk bruker ved å bruke deres ID-nummer, opprette en ny bruker, oppdatere en eksisterende bruker og en metode for å slette en spesifikk brukers data i databasen.

    Definer en kontroller for API

    Opprett en kontroller som skal administrere API-endepunktene for brukerrelaterte operasjoner.

     nest g controller users 

    Deretter legger du til koden nedenfor i users.controller.ts-filen.

     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' };
      }
    }

    Kontrolleren administrerer API-endepunkter for brukeroperasjoner. Den håndterer GET-forespørsler om å hente alle brukere, POST-forespørsler om å opprette nye brukere, PUT-forespørsler om å oppdatere eksisterende brukere og SLETT-forespørsler om å slette brukere.

      Hvordan finne klistremerker i Telegram

    Ved å bruke UsersService og samhandle med brukerenheten, gir denne kontrolleren et komplett API for å administrere brukerrelaterte operasjoner på dataene som er lagret i databasen.

    Oppdater users.module.ts-filen

    Til slutt oppdaterer du users.module.ts-filen som vist nedenfor for å sikre at du inkorporerer brukerenheten og TypeORM-modulen, som oppretter forbindelsen til databasen.

     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 {}

    Til slutt, fortsett og snurr opp utviklingsserveren for å teste CRUD-operasjonene med Postman.

     npm run start 

    Serveren starter på port 3000, og du kan sende API-forespørsler til den på http://localhost:3000/api/users.

    Bygge backend-applikasjoner med Nest.js

    Enten du utvikler en enkel REST API eller en kompleks nettapp, tilbyr Nest.js et omfattende sett med funksjoner og muligheter for å konstruere et pålitelig og robust backend-system.

    Nest.js tilbyr en mer strukturert tilnærming til prosjektutvikling enn Express.js gjør. Dette sikrer at du trygt kan bygge, skalere og vedlikeholde komplekse applikasjoner, takket være det organiserte og modulære designmønsteret.