Hur man bygger ett Nest.js CRUD REST API med TypeORM och PostgreSQL

Precis som andra Node.js-ramverk tillhandahåller Nest.js en omfattande verktygslåda för att bygga robusta och skalbara backend-tjänster. Icke desto mindre är det viktigt att förstå hur man implementerar skapa, läs, uppdatera och ta bort (CRUD) operationer i Nest.js effektivt—detta är de mest grundläggande operationerna i utvecklingen av API:er.

Lär dig hur du bygger ett Nest.js CRUD REST API med TypeORM och en PostgreSQL-databas.

Komma igång med Nest.js

För att komma igång installerar du kommandoradsverktyget Nest.js:

 npm i -g @nestjs/cli 

Skapa sedan ett nytt projekt genom att köra:

 nest new crud-app 

CLI-verktyget kommer att uppmana dig att välja en pakethanterare, välj det alternativ som du tycker är mest att föredra. Vi kommer att använda npm, Node-pakethanteraren.

CLI kommer att bygga ett grundläggande Nest.js-projekt med alla nödvändiga konfigurationsfiler och initiala beroenden som krävs för att köra applikationen.

Slutligen, navigera till projektkatalogen och starta utvecklingsservern.

 cd crud-app
npm run start

Du kan hitta detta projekts kod i dess GitHub förvaret.

Skapa en PostgreSQL-databas

Den här handledningen använder en PostgreSQL-molninstans, men du kan ställa in en lokal PostgreSQL-databas istället. Du kan installera PostgreSQL på Windows, på macOS eller på Linux.

Så här ställer du in en PostgreSQL-molninstans:

  • Gå över till ElephantSQLregistrera dig och logga in på ditt kontos översiktssida.
  • Klicka på knappen Skapa ny instans längst upp till vänster på sidan för att skapa en ny instans för din applikation.
  • Fyll i namnet på din instans, välj den kostnadsfria planen och välj slutligen region för att slutföra installationsprocessen.
  • När du har skapat databasinstansen, gå till inställningssidan och kopiera den angivna databasens URL.
  • Konfigurera databasanslutningen

    Skapa en .env-fil i projektets rotkatalog och klistra in webbadressen för databasanslutningen enligt följande:

     DATABASE_URL="<your connection url here>" 

    Installera nu dessa paket:

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

    Gå sedan vidare och skapa en databasmodul med CLI-verktyget.

     nest g module database 

    Öppna filen database/database.module.ts och lägg till följande databaskonfigurationskod:

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

    Denna databasmodul hanterar anslutningen genom att konfigurera TypeORM-modulen med den nödvändiga anslutningsparametern, databasens URL.

    Dessutom definierar den User-entiteten som en del av konfigurationen som specificerar strukturen och egenskaperna för data som lagras i PostgreSQL-databastabellen.

    I det här skedet kommer din kod förmodligen att ge ett fel eftersom du inte har skapat användarenheten ännu. Du gör det i följande steg.

    Uppdatera filen app.module.ts

    Uppdatera slutligen huvudapplikationsmodulen så att den inkluderar konfigurationen för databasmodulen.

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

    Definiera en användarmodul

    Användarmodulen fungerar som en centraliserad komponent, ansvarig för att kapsla in och hantera logiken som krävs för att implementera API:s CRUD-funktionalitet.

    Kör detta terminalkommando för att skapa API:ets användarmodul.

     nest g module users 

    CLI-verktyget uppdaterar automatiskt app.module.ts-filen för att återspegla de ändringar som gjorts, förutom att skapa användarmodulen. Detta säkerställer att den nyskapade modulen, användare, är korrekt integrerad i applikationens modulkonfiguration.

    Skapa en användarenhet

    TypeORM är ett ORM-bibliotek (Object-Relational Mapping) som förenklar databasinteraktioner i applikationer som använder TypeScript genom att mappa JavaScript-objekt till databastabeller.

    Genom att skapa en User-entitet med TypeORM definierar du strukturen och egenskaperna för användardata i PostgreSQL-databasen.

    Skapa en ny models/user.entity.ts i användarkatalogen och lägg till följande kod.

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

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

        @Column()
        name: string;

        @Column()
        email: string;
    }

    Entiteten Användare definierar strukturen för användardata som lagras i databasen. I det här fallet är det id som primärnyckelkolumn, och namn- och e-postkolumner och deras motsvarande egenskaper.

    Skapa CRUD API-tjänsten

    Skapa nu API-tjänsten som kommer att hantera logiken för CRUD-operationerna genom att köra kommandot nedan:

     nest g service users 

    Öppna filen user-auth.service.ts och lägg till denna 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);
      }
    }

    Denna UsersService-klass definierar olika API-metoder dedikerade till att hantera CRUD-operationer. Dessa metoder inkluderar att hämta alla användares data, hitta en specifik användare med deras ID-nummer, skapa en ny användare, uppdatera en befintlig användare och en metod för att radera en specifik användares data i databasen.

    Definiera en styrenhet för API

    Skapa en kontroller som kommer att hantera API-slutpunkterna för de användarrelaterade operationerna.

     nest g controller users 

    Lägg sedan till koden nedan i filen 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' };
      }
    }

    Styrenheten hanterar API-slutpunkter för användaroperationer. Den hanterar GET-förfrågningar för att hämta alla användare, POST-förfrågningar för att skapa nya användare, PUT-förfrågningar för att uppdatera befintliga användare och DELETE-förfrågningar för att ta bort användare.

    Genom att använda UsersService och interagera med användarenheten tillhandahåller denna kontrollant ett komplett API för att hantera användarrelaterade operationer på data som lagras i databasen.

    Uppdatera filen users.module.ts

    Uppdatera till sist filen users.module.ts enligt nedan för att säkerställa att du införlivar User-entiteten och TypeORM-modulen, som upprättar anslutningen till 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 {}

    Slutligen, fortsätt och snurra upp utvecklingsservern för att testa CRUD-operationerna med Postman.

     npm run start 

    Servern startar på port 3000 och du kan skicka API-förfrågningar till den på http://localhost:3000/api/users.

    Bygga backend-applikationer med Nest.js

    Oavsett om du utvecklar ett enkelt REST API eller en komplex webbapp, erbjuder Nest.js en omfattande uppsättning funktioner och möjligheter för att konstruera ett pålitligt och robust backend-system.

    Nest.js erbjuder ett mer strukturerat tillvägagångssätt för projektutveckling än vad Express.js gör. Detta säkerställer att du med säkerhet kan bygga, skala och underhålla komplexa applikationer, tack vare dess organiserade och modulära designmönster.