Прихід електронної комерції революціонізував спосіб, яким ми здійснюємо покупки та ведемо бізнес. Зі зростаючим попитом на такі послуги важливо мати надійне, масштабоване та ефективне API для електронної комерції. У цій статті ми розглянемо, як створити просте e-commerce API за допомогою NestJS, прогресивного фреймворку Node.js для розробки ефективних та масштабованих серверних додатків.
Чому NestJS?
NestJS побудований на TypeScript, супerset'і JavaScript, що додає статичні типи. Він використовує можливості таких інструментів, як Express.js (або за бажанням Fastify), надаючи міцну платформу для створення додатків.
Ось деякі ключові переваги NestJS:
- Модульність: Сприяє модульній архітектурі та допомагає ефективно організовувати код.
- Ін’єкція залежностей (Dependency Injection): Має вбудовану ін’єкцію залежностей, що сприяє створенню легкого та підтримуваного коду.
- TypeScript: Повністю підтримує TypeScript, що дає переваги типізації та інструментам розробки.
Налаштування проекту
Спочатку переконайтесь, що на вашій системі встановлені Node.js та npm. Ви можете перевірити це, запустивши:
node -v
npm -v
Якщо вони не встановлені, зверніться до офіційного сайту Node.js для інструкцій з установки.
Для початку створимо новий проект NestJS за допомогою Nest CLI:
npm i -g @nestjs/cli
nest new e-commerce-api
Перейдімо до директорії проекту:
cd e-commerce-api
Встановлення залежностей
NestJS надає багатий екосистемний набір вбудованих модулів та пакетів. Для цього проекту нам знадобляться додаткові пакети для валідації даних та взаємодії з базою даних. Ми використовуватимемо TypeORM для підтримки ORM разом із SQLite як базою даних:
npm install @nestjs/typeorm typeorm sqlite3 class-validator class-transformer
Проектування E-Commerce API
Ми створимо базове API, яке включатиме наступні функції:
1.
Операції CRUD для продуктів: Створення, читання, оновлення та видалення продуктів.
Створення модуля продукту
Почнімо з генерації модуля продукту, сервісу та контролера:
nest g module product
nest g service product
nest g controller product
Налаштування бази даних
Налаштуйте з’єднання з базою даних у файлі src/app.module.ts
:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Product } from './product/product.entity';
import { ProductModule } from './product/product.module';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'sqlite',
database: 'ecommerce.db',
entities: [Product],
synchronize: true,
}),
ProductModule,
],
})
export class AppModule {}
Опис сутності продукту
У файлі src/product/product.entity.ts
ми описуємо сутність продукту:
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
description: string;
@Column()
price: number;
}
Створення DTO для продукту
Важливо створити об'єкти передачі даних (DTO), щоб перевіряти та типізувати дані:
Створіть файл src/product/dto/create-product.dto.ts
:
import { IsString, IsInt, IsPositive } from 'class-validator';
export class CreateProductDto {
@IsString()
name: string;
@IsString()
description: string;
@IsInt()
@IsPositive()
price: number;
}
Реалізація сервісу для продукту
У файлі src/product/product.service.ts
реалізуємо сервіс для обробки логіки продукту:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Product } from './product.entity';
import { CreateProductDto } from './dto/create-product.dto';
@Injectable()
export class ProductService {
constructor(
@InjectRepository(Product)
private readonly productRepository: Repository,
) {}
async create(createProductDto: CreateProductDto): Promise {
const product = this.productRepository.create(createProductDto);
return this.productRepository.save(product);
}
findAll(): Promise {
return this.productRepository.find();
}
findOne(id: number): Promise {
return this.productRepository.findOne(id);
}
async update(id: number, updateProductDto: CreateProductDto): Promise {
await this.productRepository.update(id, updateProductDto);
return this.productRepository.findOne(id);
}
async remove(id: number): Promise {
await this.productRepository.delete(id);
}
}
Створення контролера для продукту
Описуємо маршрути у файлі src/product/product.controller.ts
:
import { Controller, Get, Post, Body, Param, Delete, Put } from '@nestjs/common';
import { ProductService } from './product.service';
import { CreateProductDto } from './dto/create-product.dto';
import { Product } from './product.entity';
@Controller('products')
export class ProductController {
constructor(private readonly productService: ProductService) {}
@Post()
create(@Body() createProductDto: CreateProductDto): Promise {
return this.productService.create(createProductDto);
}
@Get()
findAll(): Promise {
return this.productService.findAll();
}
@Get(':id')
findOne(@Param('id') id: number): Promise {
return this.productService.findOne(id);
}
@Put(':id')
update(
@Param('id') id: number,
@Body() updateProductDto: CreateProductDto,
): Promise {
return this.productService.update(id, updateProductDto);
}
@Delete(':id')
remove(@Param('id') id: number): Promise {
return this.productService.remove(id);
}
}
Запуск програми
З усім налаштованим, ви можете запустити додаток, використовуючи:
npm run start
Ваше API тепер має бути доступне за адресою http://localhost:3000/products
.
Висновок
У цій статті ми створили просте, але функціональне API для електронної комерції за допомогою NestJS.
Ця настройка надає міцну основу, на якій ви можете будувати більш складні функції, такі як автентифікація користувачів, обробка замовлень, інтеграція платіжних систем тощо. Модульна архітектура NestJS робить легким масштабування та підтримку вашого додатку в міру зростання вашого бізнесу.
Не соромтеся форкнути репозиторій і почати будувати вашу нову платформу електронної комерції! Якщо у вас є питання, залишайте коментарі нижче або зв’яжіться зі мною на Twitter.
Щасливого кодування!
Перекладено з: Creating a Simple E-Commerce API with NestJS