Как да изградите Nest.js CRUD REST API с помощта на TypeORM и PostgreSQL

Подобно на други рамки Node.js, Nest.js предоставя цялостен набор от инструменти за изграждане на стабилни и мащабируеми бекенд услуги. Независимо от това, важно е да разберете как да внедрите ефективно операциите за създаване, четене, актуализиране и изтриване (CRUD) в Nest.js – това са най-фундаменталните операции в разработването на API.

Научете как да изградите Nest.js CRUD REST API с помощта на TypeORM и PostgreSQL база данни.

Първи стъпки с Nest.js

За да започнете, инсталирайте инструмента за команден ред Nest.js:

 npm i -g @nestjs/cli 

След това създайте нов проект, като изпълните:

 nest new crud-app 

Инструментът CLI ще ви подкани да изберете мениджър на пакети, изберете опцията, която намирате за най-предпочитана. Ще използваме npm, мениджъра на пакети Node.

CLI ще създаде основен проект Nest.js с всички необходими конфигурационни файлове и първоначални зависимости, необходими за стартиране на приложението.

Накрая отидете до директорията на проекта и стартирайте сървъра за разработка.

 cd crud-app
npm run start

Можете да намерите кода на този проект в него GitHub хранилище.

Създайте PostgreSQL база данни

Този урок използва облачен екземпляр на PostgreSQL, но вместо това можете да настроите локална база данни на PostgreSQL. Можете да инсталирате PostgreSQL на Windows, на macOS или на Linux.

За да настроите облачен екземпляр на PostgreSQL:

  • Насочете се към ElephantSQLрегистрирайте се и влезте в страницата за общ преглед на вашия акаунт.
  • Щракнете върху бутона Създаване на нов екземпляр в горната лява част на страницата, за да създадете нов екземпляр за вашето приложение.
  • Попълнете името на вашето копие, изберете безплатния план и накрая изберете региона, за да завършите процеса на настройка.
  • След като създадете екземпляра на базата данни, отидете на страницата с настройки и копирайте предоставения URL адрес на базата данни.
  •   Как да направите екранна снимка на iPhone без бутони

    Конфигурирайте връзката към базата данни

    В главната директория на вашия проект създайте .env файл и поставете URL адреса за връзка с базата данни, както следва:

     DATABASE_URL="<your connection url here>" 

    Сега инсталирайте тези пакети:

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

    След това продължете и създайте модул на база данни с помощта на CLI инструмента.

     nest g module database 

    Отворете файла database/database.module.ts и добавете следния конфигурационен код на базата данни:

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

    Този модул на база данни управлява връзката чрез конфигуриране на модула TypeORM с необходимия параметър за връзка, URL адреса на базата данни.

    Освен това, той дефинира потребителския обект като част от конфигурацията, която определя структурата и свойствата на данните, съхранявани в таблицата на базата данни на PostgreSQL.

    На този етап вашият код вероятно ще изведе грешка, защото все още не сте създали обекта потребители. Ще направите това в следващите стъпки.

    Актуализирайте файла app.module.ts

    И накрая, актуализирайте основния модул на приложението, за да включите конфигурацията за модула на базата данни.

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

    Дефиниране на потребителски модул

    Потребителският модул служи като централизиран компонент, отговорен за капсулирането и управлението на логиката, необходима за прилагане на CRUD функционалността на API.

    Изпълнете тази терминална команда, за да създадете потребителския модул на API.

     nest g module users 

    CLI инструментът автоматично актуализира файла app.module.ts, за да отрази направените промени, в допълнение към създаването на потребителския модул. Това гарантира, че новосъздаденият модул, потребители, е правилно интегриран в конфигурацията на модула на приложението.

      Как да създадете различни заглавки за различни страници в Google Документи

    Създайте потребителски обект

    TypeORM е библиотека за обектно-релационно съпоставяне (ORM), която опростява взаимодействията с бази данни в приложения, които използват TypeScript, като съпоставя обекти на JavaScript към таблици на база данни.

    Чрез създаването на потребителски обект с помощта на TypeORM вие дефинирате структурата и свойствата на потребителските данни в базата данни PostgreSQL.

    В потребителската директория създайте нов models/user.entity.ts и добавете следния код.

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

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

        @Column()
        name: string;

        @Column()
        email: string;
    }

    Обектът Потребител дефинира структурата на потребителските данни, съхранявани в базата данни. В този случай това е идентификаторът като колона с първичен ключ и колоните за име и имейл и съответните им свойства.

    Създайте услугата CRUD API

    Сега създайте API услугата, която ще управлява логиката за CRUD операциите, като изпълните командата по-долу:

     nest g service users 

    Отворете файла user-auth.service.ts и добавете този код:

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

    Този клас UsersService дефинира различни API методи, предназначени за обработка на CRUD операции. Тези методи включват извличане на данни на всички потребители, намиране на конкретен потребител чрез неговия идентификационен номер, създаване на нов потребител, актуализиране на съществуващ потребител и метод за изтриване на данни на конкретен потребител в базата данни.

    Дефинирайте контролер за API

    Създайте контролер, който ще управлява крайните точки на API за свързаните с потребителя операции.

     nest g controller users 

    След това добавете кода по-долу към файла 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' };
      }
    }

    Контролерът управлява крайни точки на API за потребителски операции. Той обработва GET заявки за извличане на всички потребители, POST заявки за създаване на нови потребители, PUT заявки за актуализиране на съществуващи потребители и DELETE заявки за изтриване на потребители.

      Vectara набира $28,5 милиона, ElevenLabs получава $19 милиона

    Чрез използване на UsersService и взаимодействие с обекта User, този контролер предоставя пълен API за управление на свързани с потребителя операции върху данните, съхранявани в базата данни.

    Актуализирайте файла users.module.ts

    И накрая, актуализирайте файла users.module.ts, както е показано по-долу, за да сте сигурни, че включвате обекта User и TypeORM модула, който установява връзката с базата данни.

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

    И накрая, продължете напред и завъртете сървъра за разработка, за да тествате CRUD операциите с помощта на Postman.

     npm run start 

    Сървърът ще стартира на порт 3000 и можете да изпращате API заявки към него на http://localhost:3000/api/users.

    Изграждане на бекенд приложения с Nest.js

    Независимо дали разработвате прост REST API или сложно уеб приложение, Nest.js предлага изчерпателен набор от функции и възможности за изграждане на надеждна и стабилна бекенд система.

    Nest.js предлага по-структуриран подход към разработването на проекти от Express.js. Това гарантира, че можете уверено да изграждате, мащабирате и поддържате сложни приложения, благодарение на неговия организиран и модулен дизайн.