Як створити 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-адресу бази даних.
  • Налаштуйте підключення до бази даних

    У кореневому каталозі проекту створіть файл .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-адреси бази даних.

      13 найкращих завантажувачів списків відтворення Spotify

    Крім того, він визначає сутність користувача як частину конфігурації, яка визначає структуру та властивості даних, що зберігаються в таблиці бази даних 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 {}

    Визначте модуль Users

    Модуль користувачів служить централізованим компонентом, відповідальним за інкапсуляцію та керування логікою, необхідною для реалізації функцій CRUD API.

    Виконайте цю команду терміналу, щоб створити модуль користувачів API.

     nest g module users 

    Інструмент CLI автоматично оновлює файл app.module.ts, щоб відобразити внесені зміни, крім створення модуля користувача. Це гарантує належну інтеграцію новоствореного модуля, користувачів, у конфігурацію модуля програми.

    Створіть сутність користувача

    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 для видалення користувачів.

      Як додати друзів у Google Stadia

    Використовуючи UsersService та взаємодіючи з сутністю User, цей контролер надає повний API для керування пов’язаними з користувачем операціями з даними, що зберігаються в базі даних.

    Оновіть файл users.module.ts

    Нарешті, оновіть файл users.module.ts, як показано нижче, щоб переконатися, що ви включили сутність користувача та модуль 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. Це гарантує, що ви можете впевнено створювати, масштабувати та підтримувати складні програми завдяки організованому та модульному дизайну.